/*
求不超过200位的非负整数的和
输入:
输入不超过200位的非负整数,没有前导0
输出:
相加后的结果,没有多余前导0
测试数据;
bigDataAddOne()
输入:
2
123456 123456
123456789 123456789
输出:
Case #1:
246912
Case #2:
246913578
bigDataAddTwo()
输入:
2
2
123456 123456
3
123456789 123456789 56481826452
输出:
Case #1:
246912
Case #2:
56728740030
*/
#include <stdio.h>
#include <string.h>
int bigDataAddOne(); //处理两个大数的和,先输入测试组数,再依次输入测试数据,
int bigDataAddTwo(); //处理多个大数的和,先输入测试组数,再输入测试的大数个数,再输入多个大数
int main(){
printf("bigDataAddOne:\n");
bigDataAddOne();
printf("\nbigDataAddTwo:\n");
bigDataAddTwo();
return 0;
}
int bigDataAddOne(){ //处理两个大数的和
char sa[201],sb[202];
int ia[200],ib[201],i,k,c,saLen,sbLen;
int n,t=0;
scanf("%d",&n);
getchar();
while(n--){
memset(sa,'\0',sizeof(sa));
memset(sa,'\0',sizeof(sb));
//读入两个大数
scanf("%s",sa);
scanf("%s",sb);
//初始化
memset(ia,0,sizeof(ia));
memset(ib,0,sizeof(ib));
saLen=strlen(sa);
i=saLen-1;k=0;
//将整数sa保存到对应的整数数组中
while(i>=0){
ia[k++]=sa[i--]-'0';
}
sbLen=strlen(sb);
i=sbLen-1;k=0;
//将sb保存到对应的整数数组中
while(i>=0){
ib[k++]=sb[i--]-'0';
}
//进位初值为0
c=0;
//结果长度为k
k=saLen>sbLen?saLen:sbLen;
i=0;
while(i<k){
ib[i]+=ia[i]+c; //各对应位相加
c=ib[i]/10; //得到进位
ib[i]%=10; //得到对应位相加结果
i++;
}
if(c>0)
ib[k]+=c; //最高位有进位
else
k--;
for(i=k;i>=0;i--)
sb[k-i]=ib[i]+'0'; //结果转换为字符串
sb[k+1]='\0';
t++;
printf("Case #%d:\n",t);
printf("%s\n",sb);
}
return 0;
}
int bigDataAddTwo(){ //处理多个大数的和
char s[200]; //存放每次读入的大数 s[0]存放最高位
int sum[201]; //存放和 sum[0]存放各位
int i,j,c,len,maxlen=0;
int n,t=0;
scanf("%d",&n); //测试组数
while(n--){
memset(s,'\0',sizeof(s)); //清零
memset(sum,0,sizeof(sum));
scanf("%d",&i); //测试个数
getchar();
while(i--){
scanf("%s",s);
len=strlen(s);
if(len>maxlen)
maxlen=len; //记录结果最高位
for(j=len-1;j>=0;j--){
sum[len-1-j]+=s[j]-'0'; //颠倒求和
}
}
for(i=0,c=0;i<maxlen;i++){ //处理结果进位,从低位开始
sum[i]+=c;
c=sum[i]/10;
sum[i]%=10;
}
if(c>0)
sum[maxlen++]+=c; //向最高位进位
for(i=maxlen-1;i>=0;i--){
s[maxlen-1-i]=sum[i]+'0'; //结果以字符串方式保存
}
s[maxlen]='\0';
t++;
printf("Case #%d:\n",t);
printf("%s\n",s); //输出结果
}
return 0;
}