这道题要求不使用*,/,%的符号来实现除法。一开始考虑不断用被除数减去除数,计算轮数来得到结果,但是在极端情况下,比如被除数是INT_MAX,除数是1时,会超时。因此,在网上看到大家使用‘<<’’>>’左移右移的符号,实现乘以2的次方,大大减少了耗时。
思路如下:
举个例子:
实现的代码如下:
class Solution {
public:
int divide(int dividend, int divisor) {
long long ret = divideLong(dividend, divisor);
if (ret > INT_MAX || ret < INT_MIN)
return INT_MAX;
return ret;
}
long long divideLong(long long dividend, long long divisor)
{
if (divisor == 0)return INT_MAX;
if (dividend == 0)return 0;
long long a = abs(dividend);
long long b = abs(divisor);
long long ret = 0;
while (a >=b)
{
//count记录左移几位
int count = 0;
//a大于b左移count+1
while (a>b << (count + 1))count++;
ret += 1 << count;
a -= b << count;
}
if ((dividend < 0) ^ (divisor < 0))
ret = -ret;
return ret;
}
};