杭电1002题——大数相加

杭电1002题链接

    对于这个问题,首先需要注意的是数据范围,题目说整数长度不超过1000,我们可以认为最大数据有1000位,这远远超过了任何一种数据类型,因此这么大的两个数据相加要设计算法才能实现。

      我们可以先将数字转化为字符串储存在字符数组中,因为数字计算从末位开始并向前进位,所以我们先将数组倒置后再从数组下标为0的位置开始相加,相加后的和对10取余即为相加结果在该位置的数字,相加后的和除以10所得的商即为向前一位的进位,如此循环即可。

#include<stdio.h>
#include<string.h>
void reverse(char a[])//函数功能:将数组倒置 
{
	int i,len=strlen(a),temp;
	for(i=0;i<len/2;i++)
	{
		temp=a[i];
		a[i]=a[len-1-i];
		a[len-1-i]=temp;
	}
}
void add(char a[],char b[],char c[])//函数功能:大数相加 
{
	int len1=strlen(a),len2=strlen(b),i,m,l=0;
	reverse(a); 
	reverse(b);
	for(i=0;i<len1&&i<len2;i++)
	{
		m=(a[i]-'0'+b[i]-'0'+l)%10;//m是这一位的数,l是向前进位数 
		l=(a[i]-'0'+b[i]-'0'+l)/10;
		c[i]=m+'0'; 
	} 
	if(i<len1)
	{
		for(;i<len1;i++)
		{
			m=(a[i]-'0'+l)%10;
		    l=(a[i]-'0'+l)/10;
		    c[i]=m+'0';
		}
		
	}
	if(i<len2)
	{
		for(;i<len2;i++)
		{
			m=(b[i]-'0'+l)%10;
		    l=(b[i]-'0'+l)/10;
		    c[i]=m+'0';
		}
		
	}
	if(l)//最后一位进位 
	c[i++]=l+'0';
	c[i]='\0';
}
int main()
{
	int t,i,j,len;
	scanf("%d",&t);
	for(j=1;j<=t;j++)
	{
		char a[1001],b[1001],c[1002];
		scanf("%s%s",&a,&b);
		add(a,b,c);
		len=strlen(c);
		reverse(a);
		reverse(b);
		printf("Case %d:\n%s + %s = ",j,a,b);
		for(i=len-1;i>=0;i--)
		printf("%c",c[i]);
		printf("\n");
		if(j<t)
		printf("\n");
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值