【leetcode】Divide Two Integers (middle)☆

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

If it is overflow, return MAX_INT.

思路:

尼玛,各种通不过,开始用纯减法,超时了。

然后用递归,溢出了。

再然后终于开窍了,用循环,把被除数每次加倍去找答案,结果一遇到 -2147483648 就各种不行, 主要是这个数一求绝对值就溢出了。

再然后,受不了了,看答案。 发现,大家都用long long来解决溢出。看得我欲哭无泪啊。

综合后AC的代码:

int divide(int dividend, int divisor) {
        if(divisor == 1)
            return dividend;
        if(dividend == -2147483648 && abs(divisor) == 1)
            return 2147483647;
        
        int sign = (dividend > 0 ^ divisor > 0) ? -1 : 1;
        long long ans = 0;
        long long absdivisor = abs((long long)divisor);
        long long absdividend = abs((long long)dividend);
        long long t = absdivisor;
        long long n = 1;
        while(absdividend >= t + t) //被除数每次加倍,找到可以加到的最大值
        {
            t = t << 1;
            n = n << 1;
        }
        while(absdividend >= absdivisor) //从可以减的最大值开始,每次减,并把除数还原一部分
        {
            if(absdividend >= t)
            {
                absdividend -= t;
                ans += n;
            }
            n = n >> 1;
            t = t >> 1;
        }

        return sign * ans;
    }
原文地址:https://www.cnblogs.com/dplearning/p/4278113.html