兩數相除題解

兩數相除題解

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

返回被除數 dividend 除以除數 divisor 得到的商。

題解:這道題說實話沒啥意思,主要是邊界值的處理
除數爲INT_MIN,被除數爲-1時,單純int會發生數值位溢出,所以利用unsigned int 存儲除數和被除數可解。
在實現除法方面,採用指數逼近的方式,依次做減法,可解。注意:在找小於除數最大的指數時,用unsigned int 也會發生數值位溢出。所以採用 long long (long 同int 也是4字節)。

代碼:


class Solution {
public:
    int divide(int dividend, int divisor) {
        unsigned int x;
        unsigned int y;
        int f=1;
        if(dividend>INT_MIN&&dividend<0)
        {
            f=-f;x=-dividend;
            cout<<x;
        }
        else if(dividend==INT_MIN)
        {
            f=-f;x=dividend;
        }
        else
        {
            x=dividend;
        }
        if(divisor>INT_MIN&&divisor<0)
        {
            f=-f;y=-divisor;
        }
        else if(divisor==INT_MIN)
        {
            f=-f;y=divisor;
        }
        else
        {
            y=divisor;
        }
        long long base=1;
        long long sg=y;
        while(sg<=x)
        {
            sg=sg<<1;
            base=base<<1;
        }
        //cout<<1;
        sg=sg>>1;
        base=base>>1;
        long long res=0;
        while(x>=y)
        {
            //cout<<res<<"?"<<sg<<endl;
            x-=sg;
            res+=base;
            //cout<<res<<endl;
            while(sg>x)
            {
                sg=sg>>1;
                base=base>>1;
            }
        }
        res=f==-1?-res:res;
        if(res>INT_MAX)
            return INT_MAX;
        return res;
    }
};

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