Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
1、让divisor一直乘22、如果divisor>dividend,则用dividend - 上一个divisor
3、余下的数继续重复1,2步
这里有两种情况会溢出:
1、divisor = 0;
2、dividend = INT_MIN && divisor = -1 (因为 abs(INT_MIN) = INT_MAX + 1).
还有一点需要注意temp一直乘2会溢出,用long
dividend,divisor可能是Integer.MIN_VALUE,abs的时候会溢出int,用long缓存一下。abs时需要用java.lang.Math.abs(long a)防止溢出。
代码如下:
public class Solution {
public int divide(int dividend, int divisor) {
if (divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1)) {
return Integer.MAX_VALUE;
}
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
int result = 0;
long divd = Math.abs((long)dividend);
long div = Math.abs((long)divisor);
while (divd >= div) {
long mul = 1, temp = div;
while (divd >= temp << 1) {
temp = temp << 1;
mul = mul << 1;
}
result += mul;
divd -= temp;
}
return sign == -1? -result: result;
}
}