传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1002
题目大意:
有T组
数据,每一组数据有两个数字a
和b
,求a+b
。数字特别大,不超过1000位。
输出的注意一下,是每组之间有一个空行,而不是每一组后面跟一个空格。
思路:
就是大数相加,所谓大数相加就是模拟人手算的过程。
-
我们先用两个字符类型的数组保存两个数字。
-
去除前导零,倒置。(这个题不去前导零也可以过,数据没给到位好像是)
-
模拟手算过程
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e4+10;
char num[2][maxn],ans[maxn];
int T,cse=1;
void sum() {
memset(ans,0,sizeof(ans));
int len0 = strlen(num[0]);
int len1 = strlen(num[1]);
int carry=0,i; // 进位跟下标
int minlen = min(len0,len1);
int maxlen = max(len0,len1);
int select = (minlen==len0)?1:0; // 保存位数较大数字的下标
reverse(num[0],num[0]+len0); // 倒置
reverse(num[1],num[1]+len1);
// 模拟手算
for(i=0;i<minlen;i++) {
ans[i] = ((num[0][i]-'0')+(num[1][i]-'0')+carry)%10+'0';
carry = ((num[0][i]-'0')+(num[1][i]-'0')+carry)/10;
}
for(i=minlen;i<maxlen;i++) {
ans[i] = (num[select][i]-'0'+carry)%10+'0';
carry = (num[select][i]-'0'+carry)/10;
}
if(carry!=0) ans[i++] = carry+'0';
ans[i]='\0';
// 最后要再倒回来
reverse(num[0],num[0]+len0);
reverse(num[1],num[1]+len1);
reverse(ans,ans+i);
}
int main() {
scanf("%d\n",&T);
while(T--) {
scanf("%s %s",num[0],num[1]);
if(cse!=1) printf("\n");
printf("Case %d:\n",cse++);
sum();
printf("%s + %s = %s\n",num[0],num[1],ans);
}
return 0;
}