C++----高精度计算减法篇(超详细)

高精度减法

思路:

先看一个例子:
在这里插入图片描述
1.可以看出,从右往左做减法,大数减小数,得数为一个正数,而反过来,小数减大数,则得到的就是在原得数前面加个负号,因此,不妨我们让大数恒减去小数,这就需要我们判断两个数s1,s2的大小

2.与高精度加法类似(高精度计算可见上一篇),减法也是从右往左进行运算,所以我们要将两个数分别进行逆序存放,储存在数组a,b中

3.将两个数组a,b相减,得到的是逆序存放的各个位数上的数字,并将其储存在数组c中,如下图所示
在这里插入图片描述

4. 将c逆序输出

下面让我们来编写代码
(代码中也会有详细的解释哦~)
:代码写在main函数中时,string声明字符串,其初始化就是空字符串,但是整型数组不初始化的情况下,则是随机数,一定要初始化为0

using namespace std;
int main(){
	string s1,s2; 
	getline(cin,s1);
	getline(cin,s2);
	int a[210]={0};//数组长度随实际情况变化 
	int b[210]={0};
	int c[210]={0};//创建三个数组用来倒叙存储两个字符串
	               //以及逐位相减的结果 
	char ch='+';//创建一个字符变量并初始化为正号 
	if(s1.size()<s2.size()||s1.size()==s2.size()&&s1<s2){
		swap(s1,s2);//判断s1,s2大小,并将较大数字储存在s1中
		ch='-'; //s1比s2小的时候,实际得数是负数 
	} 
	 for(int i=0;i<s1.size();i++){
	 	a[i]=s1[s1.size()-i-1]-'0';
	 } //将s1逆序存放在a数组中 
	for(int i=0;i<s2.size();i++){
	 	b[i]=s2[s2.size()-i-1]-'0';
	 } //同理将s2逆序存放在b数组中
	 for(int i=0;i<s1.size();i++){//因为先前已经将大的数存放在s1中
	 	if(a[i]<b[i]){           //故循环次数为s1的长度  
			a[i]+=10;
	 		a[i+1]-=1;//不够减,则向前借1 
		 }
		 c[i]=a[i]-b[i]; 
	 } 
	 if(ch=='-'){
	 	cout<<ch;
	 } //若ch为负号,则输出 
	int index=0;//用来储存倒序输出的下标,并初始化为0 
	for(int i=s1.size()-1;i>=0;i--){
		if(c[i]!=0){
			index=i;
			break;
		}
	} //从后往前找到第一个不为0的下标,并将其存在index中
	for(int i=index;i>=0;i--){
		cout<<c[i]; 
	} 
	return 0;
} 

高精度减法的学习就到这里啦

如有需要改善或是不懂的地方,欢迎大家一起讨论~

此外,国庆期间会日常发布博客,一起进步吧!

最后,在十月的开始,我想说:

十月你好!

愿你将每日的闲暇,多分些给新拆的书卷,去遇见经典,遇见智慧,遇见良善,遇见那个眼里长着太阳,笑里全是坦荡的自己!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值