Description
给出两个正整数a和b,计算a+b的值。
Input
第一行是一个数字T,代表有T组输入。
接下来有T行,每行代表一组输入,每组包含两个不超过1000位的正整数a和b。
Output
对于每组输入,输出两行,第一行为”Case i:”(不包含双引号,其中i为第i组测试数据),第二行为a+b的值,每组测试数据之后加一个空行。
Samples
input Copy
2 1 5 1000000000000000000000000000000 1000000000000000000000000000000
output Copy
Case 1: 6 Case 2: 2000000000000000000000000000000
Hint
如果做过前面的题目,此题在输入输出格式上不会碰到啥问题,相较于Lecture (1) 的格式,只是多了测试数据的计数而已和最后的回车而已。本题的主要问题在于如何储存长达1000位的整数并让它们相加,显然使用int或long long都没法存下这个“庞然大物”。此时我们需要另寻它法。如果你用的是Java,那么本题你可以使用Java内置的BigInteger类轻松解决,如果是C/C++,那么本题只能使用长度为1000的数组来储存这个数字了,为了方便读入,可以使用字符串来储存这些数字,并模拟加法使他们相加。这里还需要注意,a和b都不超过1000位,但它们相加的值可能超过1000位,因此在用C风格字符串时,需要格外注意数组是否足够大。
因此我们可以写出如下代码:
#include <stdio.h>
#include <string.h>
void change(char w[]);
char w1[1002],w2[1002],w3[1002];
int main(void)
{
int i,sum,add,t,count=0;
scanf("%d",&t);
getchar();
while(t--)
{
++count;
scanf("%s %s",w1,w2);
getchar();
change(w1);
change(w2);
// puts(w1);
// puts(w2);
add=0;
for(i=0;i<strlen(w1)||i<strlen(w2);++i)
{
if(i<strlen(w1)&&i<strlen(w2))
sum=w1[i]-'0'+w2[i]-'0'+add;
else if(i<strlen(w1))
sum=w1[i]-'0'+add;
else if(i<strlen(w2))
sum=w2[i]-'0'+add;
add=0;
if(sum>9)
{
add=1;
sum-=10;
}
w3[i]=sum+'0';
}
// printf("%c\n",w3[0]);
// printf("%d\n",i);
// i=i-1;
if(add==1) w3[i++]=add+'0';
// i=i+1;
// printf("%d\n",i);
// printf("%c\n",w3[1]);
printf("Case %d:\n",count);
for(i--;i>=0;i--)
{
printf("%c",w3[i]);
}
puts("\n");
}
return 0;
}
void change(char w[])
{
char t;
int x=0,y=strlen(w)-1;
while(x<y)
{
t=w[x];
w[x]=w[y];
w[y]=t;
x++;
y--;
}
}
//高精度加法,注意点就是先输入之后,要去先将其逆序一下因为是从各位开始的,然后进入加的环节,一个for三个判断条件,再加一个if最后还要判断这样完了之后,有无进制,然后去掉前导0,逆序输出结果就行