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

leetcode 29. Divide Two Integers

时间:2017-08-08 18:00:19      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:解决   ...   组合   highlight   过程   数值   加减法   bsp   优化方案   

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

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

解决方案:加减法,最简单的方法是用被除数一直减去除数,直到为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;  

leetcode 29. Divide Two Integers

标签:解决   ...   组合   highlight   过程   数值   加减法   bsp   优化方案   

原文地址:http://www.cnblogs.com/fanhaha/p/7307811.html

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