1. 程式人生 > >LeetCode | Divide Two Integers(兩個數相除)

LeetCode | Divide Two Integers(兩個數相除)

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

題目解析:

求兩個數相除,不能用乘除法。那麼可以用加減法一點一點算。再有個計數變數,就能得到最後的結果。但是這樣會超時。

怎麼辦?這時二分法就起作用了。我們一次加上當前和的倍數,那麼就成倍的增加。當sum+sum > dividend的時候。我們就用dividend-sum;然後用新的值從sum=divisor開始重新求解。

我一開始用的遞迴的方法,結果也是超時了。以為這種方法不行。但改用非遞迴的形式,就能得到正確結果了。說明,能用非遞迴儘量用非遞迴。

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend == 0 || divisor == 0)
            return 0;
        bool flag = false;
        if((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0))
            flag = true;
        long long c = dividend;     //先用long long變數儲存兩個值,否則負數最大值求正數的時候會越界。
        long long d = divisor;      //即使將int變數abs(dividend)賦值給long long變數也會越界。應該先擴充套件
        long long a = abs(c);
        long long b = abs(d);

        long long sum = 0;
        int count = 0;
        int n = 0;

        while(a >= b){
            sum = b;
            count = 1;
            while(sum + sum <= a){
                sum += sum;
                count += count;
            }
            a -= sum;
            n += count;
        }
        if(flag)
            return 0-n;
        return n;
    }
};