题目:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
Solution:
这个解法很多版本,有不少没有考虑越界的情况,本代码测试通过,越界情况值得深思。
int divide(int dividend, int divisor)
{
if(divisor == 0) //除数为0,返回可能的整数最大值
return INT_MAX;
int res = 0;
if(dividend == INT_MIN)//若被除数为最小值,不能简单的取其绝对值,因为会越界。
{
res = 1; //将结果置为1,然后通过加上除数使其不越界
dividend += abs(divisor);
}
if(divisor == INT_MIN) //如果为最小值,那不用计算了,肯定结果肯定是小于0的
return res;
bool isneg = ((divisor^dividend)>>31)?true:false;//异或后右移31位,得到符号位,
dividend = abs(dividend);
divisor = abs(divisor);
int digit = 0;
//获得最大的基数
while(divisor <= (dividend>>1))
{
divisor<<=1;
digit++;
}
while(digit>=0)
{
if(dividend>=divisor)
{
dividend-=divisor;
if(res > INT_MAX - (1<<digit) && !isneg)//为同极性
{
//此时说明即将越界,返回最大值
return INT_MAX;
}
//为非同极性,即一正一负 INT_MIN和1
if(-res == INT_MIN + (1<<digit) && isneg)
{
return INT_MIN;//不越界,差一点正好是-INT_MIN
}
if(-res < INT_MIN + (1<<digit) && isneg)
{
return INT_MAX;//越界
}
res += 1<<digit;
}
divisor >>=1;
digit--;
}
return isneg?-res:res;
}