[Leetcode]_29 Divide Two Integers

/**
 *  Index: 29
 *  Title: Divide Two Integers
 *  Author: ltree98
 **/


除法的模拟运算。
最简单的肯定是,除数一直减去被除数,直到除数小于被除数。

while(dividend >= divisor)  {
    dividend -= divisor;
    ++ans;
}

这种方法肯定会超时(我不会说我试过。。。)
而且,显然题主不会是想让我们用这种方法来做,
题目中有明示了 division and mod operator(用位运算分解)

任何一个数都可以用以2的幂为底的数字序列之和。
比如:17 = 2^4*1 + 2^3*0 + 2^2*0 + 2^1*0 + 2^0*1

所以,就出现下面的这个解法,先找到最高可以减去的2的幂指数。
以17为例,找到4,
17 - 2^4*1 = 1
然后,再将1用3,用2,用1,用0,依次逐分。

最最后,注意一下数据处理。
首先,就是最小值,最大值部分。
然后,就是最后答案的正负值。


class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend == INT_MIN)
            if(divisor == 1)
                return INT_MIN;
            else if(divisor == -1)
                return INT_MAX;
        else if(abs(divisor) == 1)
            return dividend*divisor;

        long dividendTemp = dividend;
        long divisorTemp = divisor;     
        int isNegative = 1;
        if(dividendTemp < 0)    {
            dividendTemp = abs(dividendTemp);
            isNegative *= -1;
        }
        if(divisorTemp < 0) {
            divisorTemp = abs(divisorTemp);
            isNegative *= -1;
        }

        int maxFactor = 0;
        while(divisorTemp <= (dividendTemp>>1)) {
            divisorTemp <<= 1;
            ++maxFactor;
        }

        long ans = 0;
        while(maxFactor >= 0)   {
            if(dividendTemp >= divisorTemp) {
                ans += 1<<maxFactor;
                dividendTemp -= divisorTemp;
            }
            divisorTemp >>= 1;
            --maxFactor;
        }


        if(ans >= INT_MAX)
            return INT_MAX;
        return ans*isNegative;
    }
};
发布了472 篇原创文章 · 获赞 388 · 访问量 78万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览