Divide Two Integers

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

分析:

不能用乘、除、取模运算,我们可以用的运算还有加、减、位运算。一个比较简单的想法是在dividend上不断减去divisor,知道余数小于divisor,然后减的次数就是所求结果。这里我们可以用类似binary search的方法用幂级跳跃试探dividend是divisor的多少倍,从而达到加速的目的。幂级跳跃又有两种方式,一种是dividend先减去divisor的1倍,另一种是dividend先减去比dividend小的divisor的最大倍数。下面是两种方法对应的代码:

Leetcode 通过版本:

class Solution {
public:
    int divide(int dividend, int divisor) {
        long long div = (dividend > 0)? dividend:-(long long)dividend;
        long long dis = (divisor > 0)? divisor: -(long long)divisor;
        int result = 0;
        while(div >= dis){
            int counter = 0;
            while(div >= dis<<counter){
                counter++;
            }
            result += 1<<(counter-1);
            div -= dis<<(counter-1);
        }
        return ((dividend^divisor)>>31)?(-result):result;
    }
};

 

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend == INT_MIN && divisor == -1) return INT_MAX;
        long long div = (dividend > 0)? dividend:-(long long)dividend;
        long long dis = (divisor > 0)? divisor: -(long long)divisor;
        long long result = 0;
        while(div >= dis){
            long long c = dis;
            for(int i = 0; div >= c; i++, c<<=1){
                div -= c;
                result += 1<<i; 
            }
        }
        return ((dividend^divisor)>>31)?(-result):result;
    }
};

 

posted on 2014-10-20 19:52  Ryan-Xing  阅读(136)  评论(0)    收藏  举报