这是数学题题啊,老本行。
方法一:可以将除法转移到对数域
b
a
=
e
ln
b
a
=
e
(
ln
b
−
ln
a
)
\frac{b}{a}={{e}^{\ln \frac{b}{a}}}={{e}^{(\ln b-\ln a)}}
ab=elnab=e(lnb−lna)
c++ code:
class Solution {
public:
int divide(int dividend, int divisor) {
if (divisor == 0)return 0;
double b = fabs(dividend);
double a = fabs(divisor);
long res = exp(log(b) - log(a));
if ((dividend > 0) ^ (divisor > 0)) res = -res;
if (res > INT_MAX)return INT_MAX;
if (res < INT_MIN) return INT_MAX;
return res;
}
};
方法二:任何一个整数可以表示成以2的幂为底的一组基的线性组合.
分析:
可以对被除数进行分解。以 10 和 3 为例,首先我们确定 3 的最高次系数,
10
>
3
∗
2
1
10 > 3*{2^1}
10>3∗21&&
10
<
3
∗
2
2
10 < 3*{2^2}
10<3∗22,因此最高次系数为 2。然后我们用 10 减去
3
∗
2
1
3*{2^1}
3∗21,继续进行刚才的过程,
4
>
3
∗
2
0
4 > 3*{2^0}
4>3∗20&&
4
<
3
∗
2
1
4 < 3*{2^1}
4<3∗21,第二高次系数为 1。我们循环进行这个过程,直到最后的数小于除数为止,这些除数前面所有系数的和即为所求。注意类型一定是long long
class Solution {
public:
int divide(int dividend, int divisor) {
if (divisor == 0)return 0;
long long b = fabs(dividend);
long long a = fabs(divisor);
long long res = 0;
long long cnt = 1;//系数
while (b >= a)
{
cnt = 1;
long long temp = a;
while (b>=(temp<<1))
{
temp <<= 1;
cnt <<= 1;
}
res += cnt;
b -= temp;
}
if ((dividend > 0) ^ (divisor > 0)) res = -res;
if (res > INT_MAX)return INT_MAX;
if (res < INT_MIN) return INT_MAX;
return res;
}
};