此题主要要解决的是如何用减法模拟除法,如果一个一个减,是一定会超时的,效率也特别低。我们利用多重背包中的知识,即一个数可以由他的多个二进制组合表示。
所以,我们从刚好小于他的二进制数开始减即可,如果不够了就让减数除以2,这样能实现log级别复杂度的算法。
typedef long long ll;
class Solution {
public:
int divide(int dividend, int divisor) {
int sign = 1;
if(dividend*(ll)divisor < 0)sign = -1;
ll a = abs(dividend), b = abs(divisor);
ll ans = 0;
ll base = 1;
while(b < a)b *= 2, base *= 2;
while(a > 0)
{
while(a < b)b /= 2, base /= 2;
ans += base;
a -= b;
}
ans = ans*sign;
if(ans > INT_MAX || ans < INT_MIN)return INT_MAX;
return ans;
}
};