高精度除法(C++)

今天我们讲一下高精度除法中最简单的一种,那就是:高精度除于低精度,求商和余数。

有了前面高精度算法的基础(参见我上一篇文章),那么我想这一题我们多少应该会有点思路。

除法可以说是高精度中最难的算法了,为什么说它最难呢?因为我们人算除法的时候也难。你想,小学的时候加减乘除中最让你头疼的是哪一个?哈哈,我想当然是除法喽。这就对了,前面也说了,高精度算法的本质是模拟人的计算,那么我们人是怎么算除法的呢?答案是——截数和试商。

截数和试商

所谓截数,就是将数字从左到右,从高位到低位依次挨个截取,截取出来的数字我们把它放到x中,让x/除数,这就是试商,然后将每次的结果存到ans数组中,如果x/除数为0,说明我们截的不够大,要继续截,直到x/除数非0为止,也就是x>=除数为止。这时,我们不能继续截数,因为x已经大于除数,如果我们继续截数,那么x/除数就会超过一位数,导致ans溢出(这种高精度算法中每个整型只能存一位数字),所以此时,我们要更新x,x=x%除数

最后,一样的,去除前导0输出ans数组和x即可(x就是余数)。

C++代码实现如下:

//高精度除法(高精度除于低精度)
#include <iostream>
using namespace std;
const int N = 1e5 + 5;
int a[N], ans[N], b, x;//b为低精度除数,x为截数所得
int main() {
	string s;
	cin >> s >> b;
	for (int i = 1;i <= s.size();i++)
		a[i] = s[i - 1] - '0';//因为是除法,不会溢出,所以正向存储
	for (int i = 1;i <= s.size();i++)
	{
		x = x * 10 + a[i];//截数
		ans[i] = x / b;//存答案
		if (x >= b)x = x % b;//如果>=b,更新x
	}
	int begin = 1;
	while (!ans[begin])begin++;//去除前导0
	for (int i = begin;i <=s.size();i++)
		cout << ans[i];//输出商
	cout << endl << x << endl;//输出x(x即为余数)
	return 0;
}

好了,今天的分享就到这里,感谢观看!

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值