Question:
Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.


本题难度medium。
要点主要是:
1、要考虑除数、被除数的符号
2、如果input是 -2147483648 -1,结果就是overflow。

不过,如果使用常规的减法来解决,那么结果是超时。在此基础上,可以做优化,就是将被除数翻倍,从而加速。

public class Solution {
public int divide(int dividend, int divisor) {
//require
if(divisor==0)
return Integer.MAX_VALUE;
if(dividend==0)
return 0;
int sign=1;
if(dividend<0) sign = -sign;
if(divisor<0) sign = -sign;
long result=0;
long a=Math.abs((long)dividend),b=Math.abs((long)divisor);//be careful overflow
//invariant
while(a>=b){
long c=b;
for(int i=1;a>=c;i<<=1,c<<=1){
a-=c;
result+=i;
}
}
//ensure
long ans=(sign>0)?result:-result;
if(ans>Integer.MAX_VALUE||ans<Integer.MIN_VALUE)
return Integer.MAX_VALUE;
else
return (int)ans;
}
}

【注意】
用Math.abs函数必须将输入参数转换为long:​​​Math.abs((long)dividend)​​,否则最小值转换为正数就会溢出。