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;
    }
};

 

 

 

posted @ 2013-05-17 16:23  代码改变未来  阅读(283)  评论(0编辑  收藏  举报