题目:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题解:
这道题让我们求两数相除,而且规定我们不能用乘法,除法和取余操作,那么我们还可以用另一神器位操作Bit Operation,
比如20/3 , 20 = 3*2^2+3*2^1+2 , 因而20/3 = 2^2+2^1=6.
把除数表示为:dividend = 2^i * divisor + 2^(i-1) * divisor + ... + 2^0 * divisor。这样一来,我们所求的商就是各系数之和了,而每个系数都可以通过移位操作获得。
注意:
(1)dividend和divisor的符号。
(2)int的绝对值。int里面有一个特殊的数字:-2147483648,它的绝对值或者相反数 2147483648是超出int的范围的,对于这一情况需要特殊处理。
public int divide(int dividend,int divisor){
//dividend 被除数 divisor 除数
if(divisor==0||dividend==Integer.MIN_VALUE&&divisor==-1)
return Integer.MAX_VALUE;
int mark=-1;
if((dividend>0&&divisor>0)||(dividend<0&&divisor<0))
mark=1;
long abs_dividend=Math.abs((long)dividend),abs_divisor=Math.abs((long)divisor),result=0;
while(abs_dividend>=abs_divisor){
long tmp_divisor=abs_divisor,tmp=1;
while(abs_dividend>=(tmp_divisor<<1)){
tmp_divisor<<=1;
tmp<<=1;
}
abs_dividend-=tmp_divisor;
result+=tmp;
}
//return Math.abs(Integer.MIN_VALUE);
return mark>0?(int)result:-(int)result;
}
注意 Math.abs(Integer.MIN_VALUE) 结果为-2147483648,而Math.abs((long)Integer.MIN_VALUE) 的结果为2147483648,