大数相加 c语言

本文介绍了在C语言中,当整数溢出导致部分数据丢失时,如何使用字符串数组逐位相加解决大数相加问题。作者提供了两种代码实现,包括基本版本和优化过的版本,重点在于处理进位和数组边界情况。
摘要由CSDN通过智能技术生成

c语言中int,unsigned,long long int等类型有取值范围,超过范围的大数无法直接相加,因为会有部分数据丢失,因此我们可以使用数组的形式,依次相加,最后在打印出即可。x

下面以这一题为例

使用字符串数组能够一位一位的相加

因此数组x,y 表示两个数,z用来表示相加后的数

有题目可知相加时从数组的高位开始相加,因为存储时可以正序存储在逆序打印

详细代码如下

int main()
{
char x[max],y[max],z[max];
int n1,n2;
gets(x);
gets(y);
n1=strlen(x)-1;//访问数组时,下标比元素少1,因此减1
n2=strlen(y)-1;
int n,d,k,i;/使用d表示进1
while(n1>=0&&n2>=0)//两个数组都含有数时相加
{
	k=x[n1]-'0'+y[n2]-'0'+d;
	z[n]=k%10;//只需要存储k的余数
	d=k/10;//k大于10则进1
	n++;n1--;n2--;
}
while(n1>=0)//只有一个数组有数时
{
	k=x[n1]-'0'+d;
	z[n]=k%10;
	d=k/10;
	n++;n1--;
}
while(n2>=0)
{
	k=y[n2]-'0'+d;
	z[n]=k%10;
	d=k/10;
	n++;n2--;
}
if(d>0)//两个数组都加完后可能还含有进1位,可以根据d判断,若进1则由于n++,数组z[n]还有一位来存储
z[n]=d;
else//不进1,直接n--即可
n--;
for(i=n;i>=0;i--)
printf("%d",z[i]);
return 0;
}

数组相加时有部分重复,代码可以进一步优化

#include<stdio.h>
#include<string.h>
#define max 1100 
int main()
{
char x[max],y[max],z[max];
int n1,n2;
gets(x);
gets(y);
n1=strlen(x)-1;
n2=strlen(y)-1;
int n,d,a,b,k,i;
while(n1>=0||n2>=0)//使用a,b分别存储数组x,y的数,若数组没有数直接赋值位0即可
{
	if(n1>=0) a=x[n1]-'0';else a=0;
	if(n2>=0) b=y[n2]-'0';else b=0;
	k=a+b+d; 
	z[n]=k%10;
	d=k/10;
	n++;n1--;n2--;
}
if(d>0)
z[n]=d;
else
n--;
for(i=n;i>=0;i--)
printf("%d",z[i]);

return 0;
}

#include<stdio.h>
#include<string.h>
#define max 1100 

上面一个代码少了头文件,抱歉!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值