通过洛谷习题精准介绍大数相加的算法运算和细节。
前言
在我们使用的基本数据类型里面,他们都是有一定的范围的,从下图可以看出,每个数据类型都是有一定范围的,他们虽然可以帮助我们进行大部分的计算问题,但是在生活中我们会遇到很多的问题,如果我们想要进行计算的数字长度大于了我们的这些基本数据类型所存储的范围,我们就需要进行大数之间的操作了,今天我们就来看看大数之间的加法计算。
在洛谷中就有这道题,大家可以先去了解一下,然后帮助我们后面的学习。
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]);
}
}
这里展示的是所有的代码,如果还有什么问题可以交流。