一、问题描述
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
二、问题分析
对于处理数字问题,有几点需要注意①溢出②正负。
该题溢出的情况只有MIN_INT/-1会溢出,结果的正负与dividend和divisor都有关系。题目又描述了不能采用乘除和取模运算,那么还剩的只有加减和移位操作。而除法可以看做是加减法,为了防止超时,显然不能一个一个的加或者减,因此可以成倍的加减。具体的看代码。时间复杂度O(logn)。
三、Java AC代码
public int divide(int dividend, int divisor) {
if(dividend==0 || divisor==0) return 0;
if(dividend==Integer.MIN_VALUE && divisor==-1) return Integer.MAX_VALUE;
boolean isNeg = (dividend>0 && divisor<0) || (dividend<0 && divisor>0);
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
if(a < b) return 0;
int count = 0;
long sum = 0;
int res = 0;
while(a>=b){
sum = b;
count = 1;
while(sum+sum<=a){
sum <<= 1;
count <<= 1;
}
res += count;
a -= sum;
}
return isNeg? -res: res;
}