LeetCode 029. Divide Two Integers

Divide Two Integers

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.






这道题要求不用乘法、除法、模运算来计算两个整数的除法运算。

首先想到的是用减法,但是一个一个相减,速度太慢,比如要计算-2147483648, 1的结果,得循环2147483648次,这显然是不符合时间要求的。

为此,需要用到倍乘的思路,比如计算93除以5,93>5,5x2=10;93>10,10x2=20;93>20,20x2=40;93>40,40x2=80;93-80=13,此时所得结果为16,

13>5,5x2=10;13-10=3,此时所得结果为2,因为3<5的,所以可以将前面计算结果加起来16+2=18。

上述过程中的x2运算可以通过左移实现。

想到这一层面后,还需要注意溢出问题,最小负数为-2147483648,而最大正数为2147483647。

需要注意两个特殊的测试用例:-2147483648, 1-2147483648, -1

而题目中if it is overflow, return MAX_INT则是特别针对后一个测试用例而言的。

为了避免溢出问题,很多人都是采用long long int定义变量,其实可以不用开辟这么长的整形变量,只需unsigned int变量处理即可。

class Solution 
{
public:
    int divide(int dividend, int divisor) 
	{
        if(divisor == 0) return 0;
		bool positive = true;
		if((dividend<0 && divisor>0) || (dividend>0 && divisor<0))
			positive = false;
		unsigned int pos_dividend = abs(dividend );
		unsigned int pos_divisor  = abs(divisor);
		unsigned int temp_dividend = pos_dividend;
		unsigned int temp_divisor = pos_divisor;
		unsigned int result = 0;
		unsigned int temp_result = 1;
		while(temp_dividend >= pos_divisor)
		{
			while(temp_dividend > temp_divisor)
			{
				temp_divisor = temp_divisor << 1;
				temp_result = temp_result << 1;			
			}
			while(temp_dividend < temp_divisor)
			{
				temp_result = temp_result>>1;
				temp_divisor = temp_divisor >> 1;			
			}
			result += temp_result;			
			temp_dividend -= temp_divisor;		
		}
		if(result > 2147483647 && positive == true)result = 2147483647;
		return positive ? result : -result;
    }
};





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章