Divide two integers without using multiplication, division and mod operator.
其实刚开始看到这道题的时候,感觉应该是略简单。但真正开始写的时候发现了很多错误。
最开始的想法就是divisor一个一个加上去直到大于dividend为止,不过这样时间复杂度略高,是不会AC的。
后来的想法是每加一次,都把加数*2,这样可以较快得到收敛。得到的结果大于dividend的时候,把之前加的值减去,继续从divisor开始加。直到result和dividend的值相差小于divisor。
不过在过程中发现结点int边界的数值一直都在循环,跳不出来的原因是,我设置的类型都为int,有一些add或者result相加大于int的最大值后,得到的result和add都为负数了。这样循环改变就不会收敛了。
后来把所有的都改成long就对了。
public class Solution {
public int divide(int dividend, int divisor) { if(divisor == 0) return divisor; //if(dividend<divisor) return 0; int syn = 1; if(dividend<0) { if(divisor>0) { syn = 0; } } if(divisor<0) { if(dividend>0) { syn = 0; } } //dividend = Math.abs(dividend); //divisor = Math.abs(divisor); long longDividend = Math.abs((long)dividend); long longDivisor = Math.abs((long)divisor); long i = 1; long result = 0; long add = divisor; long div = 0; while(longDividend-result>=longDivisor) { i = 1; add = longDivisor; while(result<longDividend) { result = result + add; div = div + i; i = i + i; add = add + add; } if(result == longDividend) { break; } else { result = result - add/2; div = div - i/2; } } if(syn == 0) { div = -div; } return (int)div; } }