题目链接:https://codeforces.com/contest/1619/problem/C
题目大意
Tanya正在学习如何添加数字,但到目前为止,她做得并不正确。她使用以下算法将两个数字a和b相加:
如果其中一个数字比另一个短,Tanya会添加前导零,使数字长度相同。
数字从右到左(即从最低有效数字到最高有效数字)进行处理。
在第一步中,她将a的最后一位数字与b的最后一位数字相加,并将其总和写入答案中。
在下一步中,她对同一位置的每对数字执行相同的操作,并将结果写入答案的左侧。
例如,数字a=17236和b=3465 Tanya加起来如下:
1106911
分析
模拟题,条件比较多。
代码
#include<bits/stdc++.h> #define int long long using namespace std; int t; signed main() { cin>>t; while(t--) { string a,s; cin>>a>>s; int m=a.length(); int n=s.length();//s长度 if(m>n)//a的位数更多 { cout<<"-1"<<endl; continue; } int p=n-1; string ans=""; int f=0; for(int i=m-1;i>=0;i--) { if(a[i]>s[p]) { int now_num=s[p]-'0'; p--; if(p<0) { f=1; break;//没取的了 } now_num+=((s[p]-'0')*10);//不够从前取 p--; if(now_num<a[i]-'0')//还是不够 比如1 100 { f=1; break; } else if(now_num-(a[i]-'0')>=10)//太多了 { f=1; break; } else//可行 { ans+=(now_num-(a[i]-'0'))+'0'; } } else if(s[p]>=a[i]) { ans+=(s[p]-'0'-(a[i]-'0'))+'0'; p--; } } for(int i=p;i>=0;i--) { ans+=s[i]; } reverse(ans.begin(),ans.end());//要反过来因为是从尾部插入 if(f==1) cout<<"-1"<<endl; else { int f2=0; int l=ans.length(); for(int i=0;i<l;i++)//去掉之前运算加的0 { if(ans[i]!='0') f2=1; if(ans[i]=='0'&&f2==0) continue; else cout<<ans[i]; } cout<<endl; } } return 0; }