[leedcode 29] Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT
public class Solution { //本题很多细节需要考虑: //1.负数问题,见代码,很讨巧 //2.因为除法可以转换成减法,如果每次减一次除数,非常耗时间,例如123456/1,需要减123456次 //因此本题借鉴了位运算,先把除数每次乘以2,直到除数大于被除数,然后再相减,注意此时结果也是成倍增长的 //然后更新被除数,并且除数不断除以2,累加结果。。。 //注意终止条件:最终的差要小于原始的除数。 //本题针对除数和被除数差距很大的情况,节约了大量时间 //还有一个细节:注意溢出问题,所以需要把所有中间变量都声明为long型! public int divide(int dividend, int divisor) { long ndividend=Math.abs((long)dividend); long ndivisor=Math.abs((long)divisor); int flag=1; if(dividend<0) flag=-flag; if(divisor<0) flag=-flag; long result=0; long res=1; while(ndividend>ndivisor){ ndivisor=ndivisor<<1; res=res<<1; } while(ndividend>=Math.abs((long)divisor)){ if(ndividend>=ndivisor){ ndividend=ndividend-ndivisor; result+=res; } ndivisor=ndivisor>>1; res=res>>1; } if(flag>0){ if(result>=0x7fffffff) return Integer.MAX_VALUE; else return (int)result; } else return -(int)result; } }