首先祝大家新年快乐啊~,今天是2022年的第一天,我给大家看点好康的
大数相加
众所周知,int类型能够存储的数据范围是有限的,最高只能到2^31-1,也就是大约十位数的长度,那我们怎么计算十位以上的数字呢?
就像这样。
相信大家在看到这么一长串的数字的时候就已经想到数组了。 没错,这个就是用数组高精度做的
有以下几个难点:
1、数组怎么输入输出,数组是按什么顺序进行输入的?
2、数组的计算,两个大数长度不一样怎么办?
3、在计算过程中怎么进位?
4、代码的实现也很有难度,总难免有很多小问题。
以下是我的想法:
1、数组主要有两种输入方式:一种是for循环加scanf单个的元素,一般适合小数组的输入;第二种是把原先的数组先用for循环转换为char,然后直接以字符串scanf("%s",arr);输入,非常方便。scanf的输入顺序是从前到后,从数组的第一个元素开始存储。
2、由于scanf把最高位放在数组的最前面,而我们的加法计算要从个位开始,所以我们把数组倒过来存,让个位在最前面,只要个位在最前面对齐,也就解决了我们等下循环相加的俩数长度不同的问题了。
3、关于进位,可以先存一个变量carry=0,循环相加时把carry也加上,用if语句判断前一位的和是否大于10,是则把和数mod10,然后把carry变成1,别忘了carry用完要归0。也可以直接判断,然后计算下一个和数之前把和数加一;我用的是后者。
接下来是我的代码,希望与诸君共勉
#include<stdio.h>
#include<string.h>
#define COU 100
int main()
{
int arr1[COU] = { 0 };
char str1[COU] = { 0 };
scanf("%s", str1);
int arr2[COU] = { 0 };
char str2[COU] = { 0 };
scanf("%s",str2);
int sum[COU+1] = { 0 };
int len1 = strlen(str1);
int len2 = strlen(str2);
int i = 0;
for (i = 0; i < len1; i++)//倒序输入(把str的最后一位放在最前面,即个位在最前面)
{
arr1[i] = str1[len1 - 1 - i]-'0';
}
for (i = 0; i < len2; i++)
{
arr2[i] = str2[len2 - 1 - i] - '0';
}
int len = len1 > len2 ? len1 : len2;//三目语句
for (i = 0; i < len; i++)
{
sum[i] += arr1[i] + arr2[i];//注意进位
if (sum[i] >= 10)
{
sum[i] = sum[i] % 10;
sum[i + 1] += 1;
}
}
if (sum[len] != 0)//去除前导0
{
printf("%d", sum[len]);
}
for (i = len-1; i >=0; i--)//最后再倒序输出
{
if (sum[i] >= 0)
{
printf("%d", sum[i]);
}
}
return 0;
}
最后祝大家新年快乐,2022要天天开心,逢考必过,阖家欢乐!