题目
Number: 29
Difficulty: Medium
Tags: Math, Binary Search
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return
MAX_INT
.
题解
不许用除法、乘法、模运算,求解两个数相除。
除法可以用减法求解,但是时间很慢。
while(dividend >= dividsor)
{
dividend = dividend - dividsor;
result++;
}
这时可以考虑用二分搜索,每次把除数扩大2倍,直到比被除数大,两数相减,一下子减少一半以上。
代码
int divide(int dividend, int divisor) {
if(divisor == 1)
return dividend;
if(dividend == INT_MIN && abs(divisor) == 1)
return INT_MAX;
int result = 0;
int sign = (dividend > 0 ^ divisor > 0) ? -1 : 1;
long end = abs((long)dividend);
long sor = abs((long)divisor);
while(end >= sor)
{
long temp = sor;
int power = 1;
while((temp << 1) < end)
{
temp <<= 1;
power <<= 1;
}
result += power;
end -= temp;
}
return result * sign;
}