#include<bits/stdc++.h>
using namespace std;
/*
题目:1269: 【基础】高精度减法
解题思路:
第一步:判断正负,如果s1比s2对应的整数变小,结果为负,交换s1,s2
第二步:用string读入两个高精度整数,s1,s2
建立两个整数数组a和数组b,
然后将两个高精度整数,s1,s2逆序存入两个整数数组a和数组b
第三步:从左向右,逐位相减,不够借位
第四步:从右向左,逆序输出结果
*/
string s1,s2;//高精度整数
int a[250],b[250],c[250],len,p;
//s1,s2皆为不超过240位的正整数,所以数组a和数组b开250,
//两个不超过240位的整数相减,结果最多不会超过240位,因此c数组开250够的
//len存两个整数中较长的字符串的长度
char f='+';//表示结果的正负
int main(){
cin>>s1>>s2;
/*两个字符串怎么比较大小:
长度长的大
长度一样长,字典码大的大
*/
if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2)){
f='-';
//交换字符串s1,s2
swap(s1,s2);//直接交换2个变量的值
}
//输出测试
//cout<<f<<" "<<s1<<" "<<s2;
//将 s1,s2逆序存入两个整数数组a和数组b
for(int i=0;i<s1.size();i++){
a[s1.size()-i-1]=s1[i]-'0';//注意:要减去字符'0'
/* s[i]-->a[ ]
s1="968"--->869
s1[0]-->a[2]
s1[1]-->a[1]
s1[2]-->a[0]
s1[i]-->a[s1.size()-1-i]
*/
}
//输出测试看是否有逆序,再接着继续
// for(int i=0;i<s1.size();i++){
// cout<<a[i]<<" ";
// }
for(int i=0;i<s2.size();i++){
b[s2.size()-i-1]=s2[i]-'0';//注意:要减去字符'0'
}
//逐位相减
//减法的次数取决于两个整数中较长的字符串长度
len=s1.size();//前面已经比较过两个字符串的大小,所以这里字符串s1长度最长
for(int i=0;i<len;i++){
//如果不够减,向右借位,借1当10用
if(a[i]<b[i]){
a[i+1]=a[i+1]-1;
a[i]=a[i]+10;
}
c[i]=a[i]-b[i];
}
//判断是否要输出负号
if(f=='-') cout<<'-';
// 从右向左,逆序输出结果,从第一个遇到的非0元素开始输出
for(int i=len-1;i>=0;i--){
if(c[i]!=0){
p=i;//从右向左,第一个0元素的下标
break;
}
}
//逆序从第一个非0元素开始输出
for(int i=p;i>=0;i--){
cout<<c[i];
}
return 0;
}
/**************************************************************
Problem: 1269
User: hulaoshi
Language: C++
Result: Accepted
Time:20 ms
Memory:2080 kb
****************************************************************/