題目: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;
}