LeetCode--Divide Two Integers

Question

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

If it is overflow, return MAX_INT.

解题思路

当拿到这道题的时候,就在想为啥Accept率只有16%,可能坑有点多,没想到是真的。

下面要讲一下解题过程,首先题目说了不能用*,/, mod,所以我们可以用+,-,>>,<<。

第一反应,除法的结果就是减去减数的个数,好直接开写,结果发现超时了,说明不能直接用减法,那么我们考虑用上移位操作。 那么怎么用呢?

举个例子: 15 / (3 << 1) = 15 / (3 * 2), 15 < (3 * 2 * 2 * 2) 说明结果至少是大于等于4的,15 - (322) = 3, 3 / 3 = 1, 所以最终的结果是等于4 + 1 = 5.

代码实现细节,先将除数左移到一个比被减数大的数,然后在依次减少除数,直到被除数比除数小为止。

还有一个注意事项就是溢出的时候输出MAX_INT,为了避免这个,一来我们就把被除数和除数转为了long类型,然后最后输出的时候再判断一下即可。

代码实现

#include <iostream>

using namespace std;

class Solution {
public:
    int divide(int dividend, int divisor) {
        long sign = 1;
        if(dividend<0) sign = -sign;
        if(divisor<0) sign = -sign;
        long c = 1;
        long tmp = abs((long)dividend);
        long tmp2 = abs((long)divisor);
        while(tmp>tmp2){
            tmp2 = tmp2<<1;
            c=c<<1;
        }
        long result =0;
        while(tmp>=abs((long) divisor)){
            while(tmp>=tmp2){
                tmp = tmp - tmp2;
                result += c;
            }
            tmp2 = tmp2>>1;
            c=c>>1;
        }
        return int(sign*result > INT_MAX ? INT_MAX : sign*result);
    }
};


int main() {
    Solution* solution = new Solution();
    cout << solution->divide(1, -1) << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/zhonghuasong/p/6499030.html