【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;

    }

 

你可能感兴趣的:(LeetCode)