高精度减法
思路:
先看一个例子:
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;
}
高精度减法的学习就到这里啦
如有需要改善或是不懂的地方,欢迎大家一起讨论~
此外,国庆期间会日常发布博客,一起进步吧!
最后,在十月的开始,我想说:
十月你好!
愿你将每日的闲暇,多分些给新拆的书卷,去遇见经典,遇见智慧,遇见良善,遇见那个眼里长着太阳,笑里全是坦荡的自己!