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

    数值处理的题目,有两点要考虑的地方:

    • 正负号的问题,对于正数除正数, 负数除正数。。。。
    • 处理越界的问题。

    解决方案:加减法,最简单的方法是用被除数一直减去除数,直到为0, 但是复杂度高。

    优化方案: 使用2分法加速这个过程,不断给除数*2,任何一个证书可以表示为以2 的幂为底的一组基的线性组合,num=a1*2^0+a2*2^1....+an*2^n;让除数维左移直到大于被除数之前得到一个最大的基,然后每次减去这个基。 因为是2倍加大,复杂度为logn. 

    对于 32/3=10

           32---3*10=3*(1*(2^3)+0*(2^2)+1*(2^1)+0*(2^0))

    先找到a使得 x*2^(a+1),<=y< x*a^(a+1), res+=2^a, y=y-x*2^a

        int divide(int dividend, int divisor) {
                int cnt=divisor;
    
         long long dv=abs((long long) dividend);
         long long ds=abs((long long) divisor);
         long long remain= dv;
         long long res=0;
         while(remain>=ds)
         {
             int c=-1;
             long long v=remain;
           while(v>=ds)
           {
               v>>=1;
               c++;
           }
            remain-=ds<<c;
            res+=1<<c;
         }
         if((divisor>0)!=(dividend>0))
            res=-res;
         return res;
        }
    

      32/3

    首先将3 向左位移,移3位不能继续移   3*8=24   3*16>32, 32-24=8

           将3 从头向左移,移1 位不能移   3*2=6   3*4=12>8;  8-6;  

  • 相关阅读:
    Run command in YMAL build pipeline or Release Pipeline
    Create Pipeline for Azure Apps
    Deploy Azure App Service with VS Code
    多线程总结笔记
    @Param注解
    Mac Idea2018.1破解
    空指针异常Caused by: java.lang.NullPointerException: null
    java集合面试题
    在IntelliJ IDEA中使用git
    分支管理
  • 原文地址:https://www.cnblogs.com/fanhaha/p/7307811.html
Copyright © 2011-2022 走看看