码迷,mamicode.com
首页 > 其他好文 > 详细

[leedcode 29] Divide Two Integers

时间:2015-07-09 00:11:06      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

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

 

[leedcode 29] Divide Two Integers

标签:

原文地址:http://www.cnblogs.com/qiaomu/p/4631628.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!