Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
解:题目不能用乘除法和取余运算,直接迭代相减又会超时(时间复杂度O(n)),考虑使用移位运算。
比如20/3 , 20 = 3*2^2+3*2^1+2 , 因而20/3 = 2^2+2^1=6.
求解思路:每次将divisor左移位,直到达到小于dividend的最大整数A,此时左移次数为count,即达到an*2^n阶,商大于等于count,然后将dividend-A作为dividend,迭代运算,cout累加到商。
注意:
(1)dividend和divisor的符号。
(2)int的绝对值。int里面有一个特殊的数字:-2147483648,它的绝对值或者相反数 2147483648是超出int的范围的,对于这一情况需要特殊处理。
public int divide(int dividend, int divisor) {
if (divisor == 0) return Integer.MAX_VALUE;
int result = 0;
//获取符号位 >>>为无符号右移
boolean isNegative = (dividend ^ divisor)>>>31 == 1;
//因为0x80000000取绝对值会int越界
if(dividend == Integer.MIN_VALUE){
dividend += Math.abs(divisor);
if(divisor == -1){
return Integer.MAX_VALUE;
}
result++;
}
if (divisor == Integer.MIN_VALUE){
return result;
}
dividend = Math.abs(dividend);
divisor = Math.abs(divisor);
while (divisor <= dividend){
//这里最终的temp大于divident,所以定义为long防止int越界
long temp = divisor;
int count;
for (count = 0;temp <= dividend;count++) {
temp <<= 1;
}
result += (1<<(count-1));
dividend -= (divisor<<(count-1));
}
if (isNegative) result = -result;
return result;
}