Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
模拟除法,不能使用乘、除、取模。
一开始,我是用减法做的,然后就,T了。当被除数很大,除数很小的时候,确实就会T。
评论区高赞做法是,把被除数分块,除数也不断变大,有点快速幂的意思在里边。
比如 48 / 7
1. a = 48, c = 7, ans = 0;
2. a = 48 - 7 = 41, c = 14, ans = 0 + 1 = 1;
3. a = 41 - 14 = 27, c = 28, ans = 1 + 2 = 3;
4. a < c, 终止,开始新一轮(while循环就是为了保证最后被分出的块儿不会被遗漏)
class Solution {
public:
int divide(int dividend, int divisor) {
if (!divisor || (dividend == INT_MIN && divisor == -1))
return INT_MAX;
if (divisor == 1) return dividend;
int ans = 0; //没定义longlong是因为,排除上边两种情况,ans就不会爆int了
long long a = abs((long long)dividend);
long long b = abs((long long)divisor);
while (a >= b) {
long long c = b;
for (int i = 0; c <= a; i++) {
a -= c;
ans += (1 << i);
c <<= 1;
}
}
if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) return ans;
return -ans;
}
};