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;
    }
};





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