高精度减法(C++)

本文介绍了如何使用C++实现高精度加减法,包括数据读取(使用string)、存储策略(反向存储)、核心操作(逐项相加/减并处理进位)以及输出处理。
摘要由CSDN通过智能技术生成

分析:这是一道关于高精度算法的题目,如果你能熟练地写出高精度加法的算法,那么我相信这道题对你来说并不困难。但是对于刚接触高精度、还不太熟练的朋友,我们应该怎么操作呢?

其实,你想,说白了,高精度算法无非就是用数组模拟加减乘除的操作,比如加法要进位,减法要借位,乘法和除法稍微复杂一点,要增添一些其他的操作,但本质并不变。

高精度算法主要有以下几个要注意的方面:

1.读取

高精度问题该如何读取数据呢?对我们来说,给一大串数字,咱总不能用个int 去存吧?long long 也不行呀,要么人家怎么叫高精度呢,数据都大的要命。其实你想,那些数据看似是数字,其实也不正是字符吗,我们直接用C++给我们提供的string类字符串读取不香吗?而且string类这么强大,可以大大简化我们的操作。

2.存储

string读取确实方便,但我们操作字符其实还是不如直接操作数字顺手。我们就想着能不能多开辟一点空间,把数据存到整型数组中去。当然可以,实际上,我们也确实这么做了。其实,这里面还有更关键的一点:我们用string是按高位到低位读取的,如果我们还按这个顺序把它存到整型数组中,就会产生一些问题。比如500+501,结果是四位数,多一位,放哪呢?放后面?但是后面是低位怎么能存高位呢,放前面?别搞笑了,前面哪还有位置啊!

所以,更好的办法是反向存储,高位在后面,多的直接往后面补不就行了?这样,既转化为了操作整型数字,又解决了进位等难题,两全其美。

3.高精度(核心)

我们前面把要操作的两个高精度数字存储好了,接下来进入算法的核心——高精度操作。因为我们要输出答案,所以我们再开一个记答案的ans数组,然后把原始数据处理一下放到ans数组里,最后根据需要进行进位、借位等操作。

4.输出

既然是反向存储,那我们反向输出不就好了,由于ans数组肯定有很多前导0,所以我们从不是0的地方开始输出即可。(结果如果是0,输出0)

高精度减法C++代码实现如下:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
const int N = 1e5 + 5;
string s1, s2;
int a1[N], a2[N], ans[N], flag; //flag用于判断结果的正负
int main()
{
	cin >> s1 >> s2;//读取
	if (s1.size() <s2.size())flag = 1;
	else if (s1.size() == s2.size()){
		if (s1 < s2)flag = 1;
	}
	if (flag){//如果结果为负,输出-,并交换s1和s2
		cout << '-' << endl;
		swap(s1, s2);
	}
	for (int i = 0;i < s1.size();i++)
		a1[s1.size() - 1 - i] = s1[i] - '0';
	for (int i = 0;i < s2.size();i++)
		a2[s2.size() - 1 - i] = s2[i] - '0';//反向存储
	for (int i = 0;i < max(s1.size(), s2.size());i++)
		ans[i] = a1[i] - a2[i];//逐项相减
	for (int i = 0;i < max(s1.size(), s1.size());i++){
		if (ans[i] < 0){//如果<0,说明要借位
			ans[i] += 10;
			ans[i + 1]--;
		}
	}
	int k = N - 1;
	while ((!ans[k]) && k > 0)k--;//去除前导0
	for (int i = k;i >= 0;i--)//输出
		cout << ans[i];
	return 0;
}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值