题目:Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路:不用乘法,除法和取模运算实现两个数的除法。
- 注意考虑边界,如果
divisor = -1, dividend = INT_MIN
这时候会产生溢出,直接返回INT_MAX
。 - 如果每次用
dividend
减去divisor
,会超时,因为如果divisor = ±1
,时间复杂度为O(dividend)
。 - 优化算法是每次把除数翻倍,这样可以大大减少时间复杂度。
C++代码如下:
int divide(int dividend, int divisor) {
if(divisor == -1) {
if(dividend == INT_MIN)
return INT_MAX;
else
return -dividend;
}
long long ret = 0;
int sign = 0;
if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))
sign = 1;
long long x = dividend >= 0 ? dividend : -(long long)dividend;
long long y = divisor >= 0 ? divisor : -(long long)divisor;
while(x>=y)
{
long long z = y;
for(int i = 0; x >= z; i++, z <<= 1)
{
x -= z;
ret += (1 << i);
}
}
if(sign)
return ret;
else
return -ret;
}