Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路
边界条件:比如被除数、除数是0,另外结果的正负号要注意。
除法可以用减法实现,不过如果干减的话会很费时间,所以要想想怎么加速。
容易知道,一个数左移一位相当于乘以2。我们可以一次次把除数乘以2试探一下,到底最多能减掉 2^n*除数 多少次,这就相当于做了2^n次除法。由于试探的时候一次次做了乘方,所以试探的次数是log级别的,比原来一个个减要快多了。
代码
class Solution { public: int divide(int dividend, int divisor) { if (dividend == 0) return 0; if (divisor == 0) return INT_MAX; bool posResult = true; if ((dividend > 0 && divisor < 0) || (dividend < 0 && divisor >0)) posResult = false; long long lDividend = dividend; if (lDividend < 0) lDividend = ~(lDividend-1); long long lDivisor = divisor; if (lDivisor < 0) lDivisor = ~(lDivisor-1); long long currDivisor = lDivisor; long long accRate = 1; long long result = 0; while (lDividend >= lDivisor) { while ((currDivisor << 1) < lDividend) { currDivisor <<= 1; accRate <<= 1; } while (currDivisor > lDividend) { currDivisor >>= 1; accRate >>= 1; } lDividend -= currDivisor; result += accRate; } if (posResult) { if (result > INT_MAX) { return INT_MAX; } else { return (int)result; } } else { result = -result; if (result < INT_MIN) return INT_MIN; else return (int)result; } } };