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

Leetcode - Divide Two Integers

时间:2014-11-15 21:44:23      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   ar   sp   div   on   log   bs   

    实现两个整数的除法,不许用乘法、除法和求模。题目被贴上了BinarySearch,但我没理解为什么会和BinarySearch有关系。我想的方法也和BS一点关系都没有。

    很早以前我就猜想,整数的乘法是不是总是可以用移位和加法来实现?当然可以了,任何整数都可以写成2n或2n+1的形式,移位就是那个乘以2,加法就是最后的+1了嘛。复杂度是O(1),因为整数的移位最多32次,而循环移位的次数也极其有限。于是:

int divide(long long a, long long b)
//a /b
{
    if(b==0) return a>=0?0x7fffffff:0x80000000;
    if(a==0) return 0;
    if(b==1) return a;
    int sgn = (0x80000000 & a)^(0x80000000 & b); //0 -> +,  0x80000000 -> -
    if(a<0) a=-a;
    if(b<0) b=-b;
    //a,b>0
    if(a<b) return 0;
    int res = 0;
    int _b = b;
    while(a>b)
    {
        int twon = 1;
        while(a>b)
        {
            b<<=2;
            twon<<=2;
        }
        b>>=2;
        twon>>=2;
        a-=b;
        res += twon;
        b = _b;
    }
    if(a==b) res++;
    return sgn?-res:res;
}

    这里完了一个小trick,用long long而不是int来存变量了,主要是防止被除数太大时除数移位会溢出变成负数。当然去掉long long也不难啦,加上溢出的判断就好了。只不过,这里的溢出判断和函数atoi是有所不同的,atoi中的result每次乘以10再加上0-9,而这边是乘以2。以上。

Leetcode - Divide Two Integers

标签:style   blog   color   ar   sp   div   on   log   bs   

原文地址:http://www.cnblogs.com/zhchngzng/p/4100220.html

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