【c语言】大数相加、高精度加法

首先祝大家新年快乐啊~,今天是2022年的第一天,我给大家看点好康的

大数相加

众所周知,int类型能够存储的数据范围是有限的,最高只能到2^31-1,也就是大约十位数的长度,那我们怎么计算十位以上的数字呢?

【c语言】大数相加、高精度加法

就像这样。

相信大家在看到这么一长串的数字的时候就已经想到数组了。 没错,这个就是用数组高精度做的

有以下几个难点

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要天天开心,逢考必过,阖家欢乐!

上一篇:实验3-4 统计字符[2]


下一篇:【计理03组01号】C语言基础知识