• Leetcode Divide Two Integers


    用减法会超时,所以用除数倍增的方法来实现除法。

    以100/3为例.

    算法分别比较97, 94, 91, ..., 4,1, -2,最后dividend = -2退出while循环.算法比较了34次.

    如果采用每次采用将比较数翻倍的比较方法. 算法会得到优化. 举例如下: k初始化为0,  res = 0;

    首先用3与100比,小于. 然后翻倍6, 小于. 12, 24, 48, 96, 192, 因为192 > 100.  退回到 96. 这里共比较了 5次. 每比较一次 k++, res += 1<<k.

    100 - 96 = 4 > 除数3. 再用4重做上一步. 先跟3比较, 然后6, 6 > 4. 这次比较2次.

    回到3. 4 - 3 = 1 < 除数3. 算法停止. 总共比较了5 + 2 + 1 = 8次, 比原来的34次快了很多.

    最恶心的是必须是long long类型,否则超时。另外同样是加法,|=和+=相比明显更快。

     

    class Solution {
    public:
        int divide(int dividend, int divisor) 
        {
            int i=0;
            if(dividend==0)return 0;
            bool negetive=false;
            long long divid=dividend;
            long long divis=divisor;
            if(dividend<0){negetive=!negetive;divid=-divid;}
            if(divisor<0){negetive=!negetive;divis=-divis;}     
            if(divis==1)i=divid;
            else 
            {  
               while(divid >= divis) 
               {
                   long long temp = divis; 
                   int k=1;  
                   while(temp+temp <= divid)
                   {  
                       k <<= 1; 
                       temp = temp + temp;  
                    }
                    i |= k;
                    divid -= temp;               
               }
            }
            if(negetive)i=-i;
            return i;
        }
    };
    

     

     

  • 相关阅读:
    go语言学习笔记四(函数、包和错误处理)
    objection内存漫游实战
    脱壳工具FRIDA-DEXDump
    jsdom 用法技巧
    关于adb安装指定版本
    ob混淆
    js原型链hook
    js逆向核心:扣代码2
    ssl_logger捕获得物app双向验证数据
    js逆向核心:扣代码
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/3083896.html
Copyright © 2020-2023  润新知