[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;
    }
}

 

posted @ 2015-07-08 22:57  ~每天进步一点点~  阅读(174)  评论(0编辑  收藏  举报