C语言大数加法

/*

求不超过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; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值