[Math_Medium]29. Divide Two Integers

原題:29. Divide Two Integers

Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.

題目大意:不用乘號和除號,取余實(shí)現(xiàn)兩個數(shù)相除

解題思路:

  1. 剛開始打算直接不停地減,直到把被除數(shù)減為0止,擔(dān)心當(dāng)數(shù)比較大時可能會超時,但還是打算先試一波:
class Solution {
public:
    int divide(int dividend, int divisor)
    {
        if(divisor==0||(dividend==INT_MIN&&divisor==-1))
            return INT_MAX;
        int sign=((dividend<0)^(divisor>0))?1:-1;
        if(dividend<0)
            dividend=-dividend;
        if(divisor<0)
            divisor=-divisor;
        int ans=0;
        while(dividend-divisor>0)
        {
            dividend-=divisor;
            ans++;
        }
        if(dividend-divisor==0)
            ans++;
        ans*=sign;
        return ans;
    }
};

time_Exceeded.png

結(jié)果超時,因此得換一個思路,既然不能一個一個減,我們可以一次性減多個

  1. 對于被除數(shù)a和除數(shù)b,我們可以先a-b,如果大于0,再a-2b,再a-2(2*b),b每次翻倍,當(dāng)不能再減后,a-=b;再從a-b開始
    比如11/3,先10-3,發(fā)現(xiàn)大于0,將3擴(kuò)大2倍為6,再10-6,發(fā)現(xiàn)還是大于0,于是將6擴(kuò)大2倍即12,再11-12,發(fā)現(xiàn)小于0,于是不能再減了,最多可以減到6,即11-6=5,還剩下5,前面翻倍操作進(jìn)行了2次,相當(dāng)于減了4次,每翻一倍,操作2次。于是現(xiàn)在用5-3,發(fā)現(xiàn)大于0,于是將3擴(kuò)大2倍為6,而5-6<0,所以只能減3,這里沒有進(jìn)行翻倍,操作了一次;還剩下5-3=2,小于3,此時已經(jīng)減完了;共減了2+1=3次,即商為3;
  2. 特殊情況:除數(shù)為0,返回最大值;當(dāng)被除數(shù)為-2147483648(最小負(fù)數(shù)),除數(shù)為-1,此時商應(yīng)該是2147483648.但int最大值為2147484647,超限,于是返回最大值。

代碼如下:

class Solution {
public:
    int divide(int dividend, int divisor)
    {
        if(divisor==0||(dividend==INT_MIN&&divisor==-1))
            return INT_MAX;
        int sign=(dividend<0)^(divisor>0)?1:-1;
        if(dividend<0)
            dividend=-dividend;
        if(divisor<0)
            divisor=-divisor;
        int dividend_1=dividend,divisor_1=divisor;
        int step=1,ans=0;
        while(dividend_1-divisor>0)
        {
            divisor_1=divisor;
            step=1;
            while(dividend_1-(divisor_1<<1)>0)
            {
                divisor_1<<=1;
                step++;
            }
            dividend_1-=divisor_1;
            ans+=(1<<(step-1));
        }
        if(dividend_1-divisor==0)
            ans++;
        ans*=sign;
        return ans;
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容