题目如下:
解题思路:
本题的根本在于 被除数 可以减去多少次 除数 。如果直接暴力求解,那么当被除数为 2147483648
除数为 1 ,
必然超时。
切换问题思路,循环倍增 除数 直到再倍增时无法被 被除数 整除即停止,记录除数增大的 倍数 。然后将被除数减去目前的除数,并将除数恢复为初始值后进入下一次循环。最后结果就等于所有的记录的倍数相加。可参考下列公式来理解:
- // dividend = ... + 0*divisor*2^2 + 1*divisor*2^1 + 1*divisor*2^0
- // ans = ... + 0*2^2 + 1*2^1 + 1*2^0
代码如下:
class Solution {
public:
int divide(int dividend, int divisor) {
long res = 0;
long a = labs(dividend), b = labs(divisor);
while(a >= b){
long times = 1, temp = b; //times为被除数增大的倍数,temp为除数的中间变量
while(a >= (temp << 1)){
times <<= 1; //左移一位表示增大一倍
temp <<= 1;
}
res += times;
a -= temp;
}
res = ((dividend > 0) ^ (divisor > 0)) ? -res : res; //异或操作判断符号
return (res > INT_MAX || res < INT_MIN) ? INT_MAX : res;
}
};