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;
    }
};

点赞