码迷,mamicode.com
首页 > 其他好文 > 详细

Divide Two Integers

时间:2015-10-18 00:55:14      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:

不能使用乘法,除法和mod operator,实现除法功能。

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

用减法可以实现,但是太慢了。算法里所做的优化都是为了节省时间。

不能忽视溢出的问题。例如,被除数是Integer.MIN_VALUE,除以-1,得到的结果对于Int型来说就溢出了,因此返回Integer.MAX_VALUE

先处理符号,处理两个极端情况。其余的先转为long正数后递归处理。

除数每次左移位数都增加,这加快了运算效率。把每次递归产生的左移次数都加起来,即是结果。

Java代码:

    public int divide(int dividend, int divisor) {
        int sign = ((dividend ^ divisor)>>>31) == 1? -1:1;
        if (dividend == 0) {
            return 0;
        }
        if (divisor == 0) {
            return Integer.MAX_VALUE;
        }
        if(divisor == -1 && dividend == Integer.MIN_VALUE) {
            return Integer.MAX_VALUE;//overflow
        }
        long n1 = Math.abs((long) dividend);//avoid overflow
        long n2 = Math.abs((long) divisor);
        return (int) (div(n1,n2)*sign);
    }
        public long div(long n1, long n2){
        if (n1 < n2) {
            return 0;
        }
        int i = 0;
        while(n1 > (n2 << (i+1))){
            i++;
        }
        return (1<<i) + div(n1 - (n2<<i), n2);
    }

 这个问题有3点启示:

1、注意溢出的问题,该转换的就转换

2、关注运行效率的问题

3、移位方法的运用

Divide Two Integers

标签:

原文地址:http://www.cnblogs.com/rustfisher/p/4888597.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!