比赛时这道签到题写炸了。。写了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();
}
京公网安备 11010502036488号