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