题目:
Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
分析:
1、设法在不溢出的前提下,把除数和被除数转化成正数进行计算。
2、当 dividend/divisor>2 时,利用右移一位实现除数倍增,快速求得商。否则商为1.
class Solution {
public:
int divide(int dividend, int divisor) {
if (divisor == 0)
throw exception();
if (dividend == 0x80000000 && divisor == -1)
return 0x7fffffff;
if (divisor == 0x80000000)
return dividend == 0x80000000 ? 1 : 0;
int res = 0;
bool isfushu = false;
if ((dividend>0 && divisor<0) || (dividend<0 && divisor>0))
isfushu = true;
if (dividend == 0x80000000)
{
dividend += abs(divisor);
++res;
}
dividend = abs(dividend);
divisor = abs(divisor);
res+=divide_core(dividend,divisor);
return isfushu ? -res : res;
}
int divide_core(int dividend, int divisor)
{
int res = 0;
if (divisor == dividend)
++res;
else if (divisor<dividend)
{
int r = divisor, count = 0,intmark=0x80000000;
r = r << 1;
while ((r&intmark)==0 && r <= dividend)
{
++count;
r = (r << 1);
}
if (count>0)
{
res += (1 << count);
dividend -= (divisor << count);
res+=divide_core(dividend,divisor);
}
else
{
++res;
}
}
return res;
}
};
class Solution {
public:
int divide(int dividend, int divisor) {
if (divisor == 0)
throw exception();
if (dividend == 0x80000000 && divisor == -1)
return 0x7fffffff;
if (divisor == 0x80000000)
return dividend == 0x80000000 ? 1 : 0;
int res = 0;
bool isfushu = false;
if ((dividend>0 && divisor<0) || (dividend<0 && divisor>0))
isfushu = true;
if (dividend == 0x80000000)
{
dividend += abs(divisor);
++res;
}
dividend = abs(dividend);
divisor = abs(divisor);
res+=divide_core(dividend,divisor);
return isfushu ? -res : res;
}
int divide_core(int dividend, int divisor)
{
int res = 0;
if (divisor == dividend)
++res;
else if (divisor<dividend)
{
int r = divisor, count = 0,intmark=0x80000000;
r = r << 1;
while ((r&intmark)==0 && r <= dividend)
{
++count;
r = (r << 1);
}
if (count>0)
{
res += (1 << count);
dividend -= (divisor << count);
res+=divide_core(dividend,divisor);
}
else
{
++res;
}
}
return res;
}
};