比赛时这道签到题写炸了。。写了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();
}