29. 两数相除

这是数学题题啊,老本行。

方法一:可以将除法转移到对数域

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(lnblna)
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 &gt; 3 ∗ 2 1 10 &gt; 3*{2^1} 10>321&& 10 &lt; 3 ∗ 2 2 10 &lt; 3*{2^2} 10<322,因此最高次系数为 2。然后我们用 10 减去 3 ∗ 2 1 3*{2^1} 321,继续进行刚才的过程, 4 &gt; 3 ∗ 2 0 4 &gt; 3*{2^0} 4>320&& 4 &lt; 3 ∗ 2 1 4 &lt; 3*{2^1} 4<321,第二高次系数为 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;
	}
};

[1]https://zhuanlan.zhihu.com/p/47708379

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值