与上篇文章相似,不过是把加法换成了减法。需要注意的就是符号的确定以及借位问题。
步骤:
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;
}