高精度减法

         与上篇文章相似,不过是把加法换成了减法。需要注意的就是符号的确定以及借位问题。

步骤:

1.判断s1是否比s2小,如果s1较小则要交换s1与s2,并输出符号位‘-’

2.各位对齐-反转,字符型转整型 

3.计算c数组的长度,按照最长数位算(这时的最长位数是s1和s2长度的最大值)

4.对位相得减到c数组,此时需要注意是否需要借位 

5.去除前导0 

6.倒序打印 

#include<bits/stdc++.h>
using namespace std;
int a[101],b[101];//s1的转换,s2的转换 
int c[101];//s1和s2的数值之和的转换 

//将s1和s2的数值倒置 
void strtoint(string s,int n[]){
	/*
	下标   		012345
	s1	   		12345
	a(倒置后) 	 54321(从下标1开始) 
	*/ 
	for(int i=0;i<s.size();i++){
		n[s.size()-i]=s[i]-'0';
	}
}

bool cmpstr(string str1,string str2){
	if(str1.size()!=str2.size())
	//如果str1的长度大于str2的长度返回true
		return str1.size()>str2.size();
	//如果str1和str2的长度相等则判断str1和str2谁更大
	else
		return str1>=str2; 
} 

int main(){
	//高精度数值 
	string s1,s2;cin>>s1>>s2;
	int la=s1.size();
	int lb=s2.size();
	//1.判断s1是否比s2小 
	if(cmpstr(s1,s2)==false){
		swap(s1,s2);//交换s1和s2
		cout<<"-";// 他们相减必然是负数,先输出符号 
		/*
			也可以使用
			string s3;
			s3=s1;
			s1=s2;
			s2=s3; 
		*/ 
	} 
	//2.各位对齐-反转,字符型转整型 
	strtoint(s1,a); 
	strtoint(s2,b);
	//3.计算c数组的长度,按照最长数位算 
	int lc=max(la,lb);
	//4.对位相减得到c数组 
	for(int i=1;i<=lc;i++){
		if(a[i]<b[i]){
			a[i+1]--;//向高位借位 
			a[i]+=10;
		} 
		c[i]=a[i]-b[i];
	}
	//5.去除前导0 
	while(c[lc]==0&&lc>1){
		lc--;
	}
	//6.倒序打印 
	for(int i=lc;i>=1;i--){
		cout<<c[i];
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚睡贵妃写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值