给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
暴力搜索法升级,加大步长, 由线性逼近改为指数逼近
class Solution {
public:
int divide(int dividend, int divisor)
{
//特殊情况判断
if (dividend == 0)
{
return 0;
}
if (divisor == 1)
{
return dividend;
}
if (divisor == -1)
{
if (dividend > INT_MIN)
{
return -dividend;
}
return INT_MAX;
}
long a = dividend;//防止越界
long b = divisor;
bool sign = false;
if ((a > 0 && b < 0) || (a < 0 && b>0))
{
sign = true;
}
a = a > 0 ? a : -a;
b = b > 0 ? b : -b;
long res = div(a, b);
if (sign)
{
return -res;
}
return res > INT_MAX ? INT_MAX : res;
}
//递归,求出a包含b的count,而后继续递归(a-b)包含b的次数。例如11,3;6包含2个3,而后去计算5包含几个3
int div(long a, long b)
{
if (a < b)
{
return 0;
}
long count = 1;
long tb = b; // 在后面的代码中不更新b
while ((tb + tb) <= a)
{
count = count + count; //count翻倍
tb = tb + tb; // 由线性逼近改为指数逼近
}
return count + div(a - tb, b);
}
};