每减一次除数即使之倍增,用这种方法很快就可以将除数变为相当大的数字,从而加快除法的速度。
参考了大神的解答:
http://blog.csdn.net/kenden23/article/details/16986763
真是优美的答案啊。比起其他人的解答,漂亮不知百倍。
然后调试时,又不出所料地犯了所有男人都会犯的错误: 溢出!
在调用abs之前,一定要先转成比它大的集合来进行处理:
int-> long
我是用调试器来调试才发现此错误的,看来以后一定要注意溢出问题喽!
package Algorithms;
public class DivideTwoIntegers {
public static void main(String[] args) {
System.out.println(divide(-2147483648, 1));
}
public static int divide(int dividend, int divisor) {
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
int ret = 0;
while (a >= b) {
long bTmp = b;
int cnt = 1;
for (int i = 1; a >= bTmp; cnt <<= 1, bTmp <<= 1) {
a -= bTmp;
ret += cnt;
}
}
return ((dividend > 0) ^ (divisor > 0)) ? -ret: ret;
}
}