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