——Divide Two Integers

29、Divide Two Integers

兩個整數相除

將兩個整數相除,要求不使用乘法、除法和 mod 運算符。

如果溢出,返回INT_MAX.

樣例

給定被除數 = 100 ,除數 = 9,返回 11

分析:

1.不能使用乘除和mod,那麼整數相除能有的方法便是
<1>重複減除除數,這種方法在除數和被除數相差極大時,如2147483647:2,計算次數會在十億次以上,必然會超時。所以此種方法便放棄了。
<2>使用位移符,每一個數都可以通過公式n=a(0)2^0+a(1)2^1+a(2)2^2+……+a(n)2^n來傳化爲二進制數,我們也就可以通過減去位移後的除數來得到相應的a(n),
左移<<:100010<<1=000100
右移>>:100010>>1=010001
同位與&:1000101&1=1;
同位異或^:1^1=0;

代碼:

class Solution {
public:
    typedef long long ll;
    int divide(int dividend, int divisor) {
        ll end=abs((ll)dividend);
        ll sor=abs((ll)divisor);
        ll res=0,shift=31;
        while(shift>=0)
        {
            if(end>=sor<<shift)//a(n)不爲0
            {
                end-=sor<<shift;
                res+=1LL<<shift;//加上a(n)
            }
            shift--;
        }
        res=(dividend^divisor)>>31?-res:res;//比較正負號
        if(res>INT_MAX)return INT_MAX;
        return res;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章