Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
class Solution {
public:
int divide(int dividend, int divisor) {
if (divisor == 0 || divisor == -1 && dividend == INT_MIN) // 特殊情况会导致结果溢出
return INT_MAX;
int result = 0;
long long int Divisor = divisor;
long long int Dividend = dividend;
if (Dividend > 0 && Divisor > 0)
{
if (Dividend >= Divisor * 2)
{
result = 1;
Divisor = Divisor * 2; // 采用一个加倍扩大除数的方法,可以将时间复杂度变成O(logn+n/2),n为输入被除数的大小
while (Dividend >= Divisor)
{
// Dividend = Dividend - Divisor;
Divisor = Divisor * 2;
result = result * 2;
}
}
Dividend = Dividend - result * divisor;
Divisor = divisor;
while (Dividend >= Divisor)
{
Dividend = Dividend - Divisor;
result += 1;
}
}
if (Dividend > 0 && Divisor < 0)
{
if (Dividend + Divisor * 2 >= 0)
{
result = -1;
Divisor = Divisor * 2;
while (Dividend + Divisor >= 0)
{
Divisor = Divisor * 2;
result = result * 2;
}
}
Dividend = Dividend - result * divisor;
Divisor = divisor;
while (Dividend + Divisor >= 0)
{
Dividend = Dividend + Divisor;
result -= 1;
}
}
if (Dividend < 0 && Divisor > 0)
{
if (Dividend + Divisor * 2 <= 0)
{
result = -1;
Divisor = Divisor * 2;
while (Dividend + Divisor <= 0)
{
// Dividend = Dividend - Divisor;
Divisor = Divisor * 2;
result = result * 2;
}
}
Dividend = Dividend - result * divisor;
Divisor = divisor;
while (Dividend + Divisor <= 0)
{
Dividend = Dividend + Divisor;
result -= 1;
}
}
if (Dividend < 0 && Divisor < 0)
{
if (Dividend <= Divisor * 2)
{
result = 1;
Divisor = Divisor * 2;
while (Dividend <= Divisor)
{
// Dividend = Dividend - Divisor;
Divisor = Divisor * 2;
result = result * 2;
}
}
Dividend = Dividend - result * divisor;
Divisor = divisor;
while (Dividend <= Divisor)
{
Dividend = Dividend - Divisor;
result += 1;
}
}
// result = dividend / divisor;
return result;
}
};