题目
一次一次的减被除数也是可以的,但是超时。那么就改成每一次都放大当前的一倍来减。得到的结果也就是k=2a+2b+2**c……
class Solution {
public int divide(int dividend, int divisor) {
boolean isNeg = (dividend>0 && divisor<0) || (dividend<0 && divisor>0);
long div1 = Math.abs((long)dividend);
long div2 = Math.abs((long)divisor);
long res = 0;
while(div1>=div2){
long sum = div2;
long pow = 1;
while(sum+sum<div1){
sum += sum;
pow += pow;
}
div1 -= sum;
res += pow;
}
res = isNeg?(-res):res;
if(res>Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}
return (int)res;
}
}
要注意特殊的case:-2147483648,-1规定输出的结果是:2147483647
再次回看这道题,还是忘记了这个巧妙的方法。其实这种方法也没必要强行和二进制扯上关系。本质上就是一种把divisor变大的方法。使得进行计算的时候更快。