zoukankan      html  css  js  c++  java
  • 29. Divide Two Integers

    用加减法模拟除法。

    除法本质就是 被除数 - 商个除数相加 = 0

    如果你电脑足够好,可以无限减。。但是这个题肯定不是这么简单。

    最快的方法还是 减去 商乘以除数。
    但是这里不能使用乘法,那只好用BIT的运算来实现了。

    自己没做出来,但是发现一刷做出来了,怎么看都不像是我这个智商能写出来的,所以不知道当时看的哪的答案,贴出的答案如有冒犯,请告之。

    比如19/3,只要分子比分母大,就可以除。
    19 比 3大, 比2个还3大,牛逼牛逼,比4个3大,你敢信?比8个3小。。
    那么19先减去4个3肯定没错,此时分子是19-4*3=7;结果是4,已经4个3了。

    然后再看7/3,7比1个3大,比2个3大,那么分子就是7-2*3 = 1,结果是2+刚才的4=6。
    然后1/3,比3小了,让你装逼。此时停止,结果是第一次的2+刚才的4=6.

    所以就是通过BIT位操作来看剩下的分子比几个分母大,正常乘法是1234567个这么测试,测1次就行了,但是用BIT是测很多次,每次1248个,最后相加。

    然后各种edge case好贱。

    public class Solution {
        public int divide(int dividend, int divisor) 
        {
            if(dividend == 0) return 0;
            
            long up = (long)dividend; 
            long down = (long)divisor;
            
            boolean pos = (up*down) >= 0;
            up = Math.abs(up);
            down = Math.abs(down);
            
            long res = 0;
            while(up >= down)
            {
                int numOfDowns = 1;
                
                while(up > (down<<1))
                {
                    
                  down <<= 1;
                  numOfDowns <<= 1;
                    
                }
                
                up -= down;
                res += (long)numOfDowns;
                down = Math.abs((long)divisor);
            }
    
            if(res == (long)Integer.MIN_VALUE*(-1) && pos) return Integer.MAX_VALUE;
            if(pos) return (int)res;
            else return (int)res*-1;
        }
    }
    
  • 相关阅读:
    [常用的Cmd运行命令]
    [Ajax三级联动 无刷新]
    [占位符 &nbsp; ]
    [String.Format(转换时间格式)]
    [ASP.NET应用到的时间处理函数]
    [SQL Server常用系统存储过程大全]
    [SQL Server创建视图时的注意点]
    [SQL Server 视图的创建- (create view必须是批处理中仅有的语句问题)]
    [SQL 高级查询运算符的用法 UNION (ALL),EXCEPT(ALL),INTERSECT(ALL) ]
    layui 表单遇到的小问题
  • 原文地址:https://www.cnblogs.com/reboot329/p/5887392.html
Copyright © 2011-2022 走看看