比赛时这道签到题写炸了。。写了1个多小时还没写对,还想着有没有什么空格、除‘+’之外的其他符号。。开始写高精度怎么也写不对,后来又试试__int128(赛后才发现2^128只有38位左右,还是不够)
以上都是废话qwq我还是太菜了
赛后稍微改一改就过了,好气哦qwq。。
只需注意4个坑:字符串中+在最前、在最后、没有+、不止一个+,有前导零的数据已经去掉了。。
#include<cstdio> #include<cstring> using namespace std; char c[10005]; int ans[10005];//存答案 int add,len,i,j,k,a,b,L,R,last,num; inline void solve() { last=add=num=0; scanf("%s",c),len=strlen(c); if (c[0]=='+' || c[len-1]=='+') {//+在最前、在最后 puts("skipped"); return; } for (int tmp=0; tmp<len; tmp++)//+号个数及位置 if (c[tmp]=='+') add++,i=tmp; if (add!=1) { puts("skipped"); return; } k=len-1,j=i-1;//i为+号位置,j,k为两数右边界 L=0,R=i+1;//两数的左边界 /*去前导0 while(c[L]=='0') L++; while(c[R]=='0' && R<len) R++; if (j<L && k<R) {//如果两数都是0 puts("0");//0+0=0 return; } */ while(j>=L || k>=R) {//对于+两边的数,从两数最右边(len-1与i-1)开始计算 a=b=0; if (j>=L) a=c[j]-'0'; if (k>=R) b=c[k]-'0'; ans[num++]=(a+b+last)%10;//倒序记录答案 last=(a+b+last>9);//进位 j--,k--; } if (last) printf("%d",last); for (int tmp=num-1; tmp>=0; tmp--) printf("%d",ans[tmp]); puts(""); } int main() { int T; scanf("%d",&T); while(T--) solve(); }