题目:Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题意:求两个数的商;
有两种情况溢出:
1.divisor = 0;
2.dividend = INT_MIN and divisor = -1 (因为 abs(INT_MIN) = INT_MAX + 1).
思路:基本原理是移位,第1次移位的大小正好是divisor的大小,
第2次的大小正好是divisor扩大2倍的大小,第3次的大小正好是divisor扩大2²倍的大小,
If it is overflow, return MAX_INT.
题意:求两个数的商;
有两种情况溢出:
1.divisor = 0;
2.dividend = INT_MIN and divisor = -1 (因为 abs(INT_MIN) = INT_MAX + 1).
思路:基本原理是移位,第1次移位的大小正好是divisor的大小,
第2次的大小正好是divisor扩大2倍的大小,第3次的大小正好是divisor扩大2²倍的大小,
第4次的大小正好是divisor扩大2³倍的大小......以此类推;
class Solution {
public:
int divide(int dividend, int divisor) {
if (!divisor || (dividend == INT_MIN && divisor == -1))
return INT_MAX;
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
long long dvd = labs(dividend);
long long dvs = labs(divisor);
int res = 0;
while (dvd >= dvs) {
long long temp = dvs, multiple = 1;
while (dvd >= (temp << 1)) {
temp <<= 1;
multiple <<= 1;
}
dvd -= temp;
res += multiple;
}
return sign == 1 ? res : -res;
}
};