【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,---别忘了
}
}