首页 > 代码库 > Leetcode - Divide Two Integers

Leetcode - Divide Two Integers

    实现两个整数的除法,不许用乘法、除法和求模。题目被贴上了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