【ATT】Divide Two Integer
Q: Divide two integers without using multiplication, division and mod operator.
不用乘法,除法,取余实现两个int的相除。
A: 二分的应用。
如果按divident = divident-divisor,直至divident<divisor,统计divisor减去的个数,这样话当divident = INT_MAX, divisor = 1时,时间复杂度很高,每次只减去1.
因此,计数时考虑用二分的情况。当sum<divident时,sum+=sum,sum直接翻倍。加快计算。
注意:1.int取绝对值后,范围可能会超出int(例如INT_MIN), 因此要用long long 存储取绝对值后的结果。(为什么不用unsinged int呢?因为二分时,当sum=|INT_MIN|,sum += sum,此时会溢出,超出unsigned int的表达范围)
2. 对divident和divisor取绝对值,不能用abs,labs也不行。。abs(INT_MIN) 得到的还是INT_MIN,因此只能用-divident
int divide(int dividend, int divisor) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
bool bNegative = false;
if((dividend>0&&divisor<0)||(dividend<0&&divisor>0))
bNegative = true;
long long a = dividend,b=divisor;
if(dividend<0)
a = -(long long)dividend;
if(divisor<0)
b = -(long long)divisor;
long long sum = 0;
long long res = 0;
long long cnt = 0;
while(a>=b) //注意是a>=b
{
sum = b;
cnt = 1;
while(sum+sum<=a)
{
sum += sum;
cnt += cnt;
}
res += cnt;
a -= sum;
}
if(bNegative)
res = -res;
return res;
}
循环这样更快。
while(a>=b)
{
sum = b;
cnt = 1;
while(a>=sum)
{
a-=sum;
res+=cnt;
cnt<<=1; //cnt<<1
sum<<=1; //sum<<1,sum直接*2了,加快计算,同时cnt也要*2,---别忘了
}
}
浙公网安备 33010602011771号