Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路: 需要注意的是Math.abs(Integer.MIN_VALUE)=Integer.MAX_VALUE+1;
因此当遇到被除数是Integer.MIN_VALUE时,需要将其单独拿出来处理;
由一个数的二进制形式可以知道,x=a0*2^n0+a1*2^n1+...+ak*2^nk;被除数
y=b0*2^n0+b1*2^n1+...+bj*2^nj; 除数
15除以3: 15-3*2^2=3, 3-3*1=0,0<3终止,因此最后的值是3+1=4;
时间复杂度: O(logN)
public int divide(int dividend, int divisor) {
if(divisor==0||(dividend==Integer.MIN_VALUE&&divisor==-1))
return Integer.MAX_VALUE;
if(divisor==Integer.MIN_VALUE&÷nd>Integer.MIN_VALUE)
return 0;
if(divisor==Integer.MIN_VALUE&÷nd==Integer.MIN_VALUE)
return 1;
int sign=(dividend<0)^(divisor<0)?-1:1;//最终的符号
int dvs=Math.abs(divisor);
int result=0;
if(dividend==Integer.MIN_VALUE){
result=1;
result+=divide(Math.abs(dividend+dvs),dvs);
return result*sign;
}
int dvd=Math.abs(dividend);
int i,j;
while(dvd>=dvs){
i=1;
j=dvs;
while(dvd>=((long)j<<1)){//可能会越界
i<<=1;
j<<=1;
}
dvd-=j;
result+=i;
}
return result*sign;
}