时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
在一行中给出一个字符串,请判断是否满足A + B格式,如果满足,输出计算结果,否则输出"skipped"。
此处A,B均为大于等于0的整数,不保证数据没有前导零。
输入描述:
第一行输入一个n, 1 \le n \le 1000n,1≤n≤1000,代表测试数据的组数。
接下来n行,每行输入一个长度不超过10000的字符串。
输出描述:
对于每组输入,输出结果
示例1
输入
4
2+2
1+2
+12
0+0
输出
4
3
skipped
0
分析:本题用常规整型计算肯定不行,要用字符串前后拆分加和,但是注意细节
#include<cstdio>
#include<cstring>
char a[10005];
int num[10005];//存放答案
void fun()//处理函数
{
int t,count=0;
scanf("%s",&a);//输入算式
int len=strlen(a);
if(a[0]=='+'||a[len-1]=='+')//当+在开头和结尾的时候
{
printf("skipped\n");
return;
}
for(int i=0;i<len;i++)//找到加号
{
if(a[i]=='+')
{
t=i;//记录下+号的位置
count++;
}
}
if(count>1||count==0)//当+号多余一个或者没有+号时
{
printf("skipped\n");
return;
}
int begin_1=0,begin_2=t+1,end_1=t-1,end_2=len-1;
int c=0,k=0;
while(end_1>=begin_1||end_2>=begin_2)//将+号前后从后往前加和
{
int m1=0,m2=0;
if(end_1>=begin_1)m1=a[end_1]-'0';
if(end_2>=begin_2)m2=a[end_2]-'0';
num[c++]=(m1+m2+k)%10;
k=(m1+m2+k)/10;
end_1--;
end_2--;
}
if(k)
{
printf("%d",k);
}
for(int i=c-1;i>=0;i--)
printf("%d",num[i]);
printf("\n");
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
fun();
}
return 0;
}
高精度加法计算核心:
num[c++]=(m1+m2+k)%10;
k=(m1+m2+k)/10;
注意:m1,m2之前必须是整型