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