Divide Two Integers

一. Divide Two Integers

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

Difficulty:Medium

TIME:TIMEOUT

解法

實現整數的除法,不能用乘法除法以及取餘。因此就剩下加減法,用加減法當然可以,不過很明顯當被除數過大,除數過小的時候,就會超時。

因此只能採用其他的方法, 那就是移位。

對於正整數n來說:

  • n << k相當於n2k
  • n >> k相當於n/2k

對於被除數dividend,以及除數divisor,有dividend=divisort+r ,其中r爲餘數。t既然作爲整數,那麼就可以令t=20+21+...+2k ,也就是說dividend=divisor(20+21+...+2k)+r ,結合上面的移位操作符則dividend=divisor<<0+divisor<<1+...+divisor<<k+r ,那麼這道題就可以通過這樣的方法求解。

int divide(int dividend, int divisor) {
    if(dividend == INT32_MIN && divisor == -1)
        return INT32_MAX;
    bool sign = (dividend < 0) ^ (divisor < 0);
    long ldividend = labs(dividend);
    long ldivisor = labs(divisor);
    int result = 0;
    while(ldividend >= ldivisor) {
        long k = ldivisor;
        long l = 1;
        while(ldividend >= (k << 1)) {
            k = k << 1;
            l = l << 1;
        }
        result += l;
        ldividend -= k;
    }
    return sign ? -result : result;
}

代碼的時間複雜度爲O((logn)2) ,其中n 爲數字的位數。

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