• [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;
        }
    }
  • 相关阅读:
    软件工程学习小结
    Java中protected方法访问权限的问题
    HDU1395 2^x mod n = 1 暴力题
    HDU1394 线段树求最小逆序数
    HDU2030 汉字统计
    HDU2028 最小公倍数
    mysql中如何创表以及添加各种约束条件
    数据库知识总结
    如何在dos命令中启动mysql或sql server 服务器的一些操作
    mysql如何建表
  • 原文地址:https://www.cnblogs.com/qiaomu/p/4631628.html
Copyright © 2020-2023  润新知