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

}
}

posted @ 2013-09-18 16:56  summer_zhou  阅读(242)  评论(0编辑  收藏  举报