大数相加算法

通过洛谷习题精准介绍大数相加的算法运算和细节。


前言

在我们使用的基本数据类型里面,他们都是有一定的范围的,从下图可以看出,每个数据类型都是有一定范围的,他们虽然可以帮助我们进行大部分的计算问题,但是在生活中我们会遇到很多的问题,如果我们想要进行计算的数字长度大于了我们的这些基本数据类型所存储的范围,我们就需要进行大数之间的操作了,今天我们就来看看大数之间的加法计算。

在洛谷中就有这道题,大家可以先去了解一下,然后帮助我们后面的学习。

P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


一、大数相加是什么?

大数很容易理解,就是基本数据类型无法存储的数据,这个时候我们就需要借助数组进行操作,来帮助我们进行计算。

二、使用步骤

1.初始化

代码如下(示例):

    char a[10005],b[10005];
	scanf("%s%s",a,b); 
	int a1[10005]={0},b1[10005]={0};
	int len1=strlen(a);
	int len2=strlen(b);
	int len=len1>len2?len1:len2;

 在这里我们需要利用字符串进行存储数据,然后定义数组方便后面的计算。

在这里我们用到了strlen函数,这是帮助我们用来计算字符串长度的。

然后还用到了三目运算符,这个帮助我们判断那个字符串的长度大,可以方便我们后面很多的操作。这里还可以用if语句进行判断,然后帮助我们找到最大的。

2.反转

代码如下(示例):

	for(int i=len1-1;i>=0;i--){
		a1[len1-i-1]=a[i]-'0';
	}
	for(int i=len2-1;i>=0;i--){
		b1[len2-i-1]=b[i]-'0';
	}

在这里我们就需要把字符串里的字符转化为数组,存储到数组里面,这利用到数学计算,如果很难理解数组的下引,我们在定义一个数字,在每一次存储之后就增加。

我们需要注意的是需要把字符串数组里面的字符翻转过来,这样方便后面的计算。

这里面需要注意的就是0的assicll表,其实我们没有必要记住他们所有的大小,只需要减去'/0'就行,这样就帮助我们进行了转换。

3.经行运算

代码如下(示例):

    for(int i=0;i<len;i++){
		a1[i]=a1[i]+b1[i];
		a1[i+1]+=a1[i]/10;
		a1[i]=a1[i]%10;
	}
	if(a1[len]!=0){
		len++;
	}

 首先进行加法运算,然后对数组的下一位进行赋值,这里我们需要注意的是我们要加上他进的数,不能只是简单的赋值。(注意注意!!!!一定要加上他进的数,而不是简单的赋值)

然后就是对于当前数组进行赋值,这里就要取所加数的和的模了。

最后最重要的就是,我们要判断他最后一位是否有进位,如果有的话,我们就要把之前求的最大的长度经行加1。

4.输出

for(int i=len-1;i>=0;i--){
		printf("%d",a1[i]);
	} 

因为之前我们的运算都是用的从后往前,而我们输出的时候是需要反向的,这个时候用for语句就可以实现。 

总结

代码如下(示例):

#include<stdio.h>
#include<string.h>
int main()
{
	char a[10005],b[10005];
	scanf("%s%s",a,b); 
	int a1[10005]={0},b1[10005]={0};
	int len1=strlen(a);
	int len2=strlen(b);
	int len=len1>len2?len1:len2;
	for(int i=len1-1;i>=0;i--){
		a1[len1-i-1]=a[i]-'0';
	}
	for(int i=len2-1;i>=0;i--){
		b1[len2-i-1]=b[i]-'0';
	}
	for(int i=0;i<len;i++){
		a1[i]=a1[i]+b1[i];
		a1[i+1]+=a1[i]/10;
		a1[i]=a1[i]%10;
	}
	if(a1[len]!=0){
		len++;
	}
	for(int i=len-1;i>=0;i--){
		printf("%d",a1[i]);
	} 
} 

这里展示的是所有的代码,如果还有什么问题可以交流。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值