大数相加(A+B)(超详细)!

洛谷算法之大数相加

先看题目:

在这里插入图片描述


思路分析:
看a和b的取值范围是(0至10的500次方)在c语言中就算用unsigned long long int(0至2的64次方)也超出了范围,因此这道题不能简单的用数学中的加法直接相加,这里就引出字符串数组来计算和储存,下面直接上代码并附带分析。


#include<stdio.h>
#include<string.h>
int main()
{
	char s[10000],ss[10000]; 这里的范围我们设大一些,最多就放10000个数(1010000方)
	int a[10000], b[10000];  这里用来进行数学运算,并将最后的结果储存在a[10000]int len;
	scanf("%s%s", s, ss)     输入要计算的2个数字
	int len1 = strlen(s);    "strlen"是一个计算字符串长度的函数 
	int len2 = strlen(ss);   将输入的两个字符串的长度赋值给len1,len2
	if (len1 > len2)
		len = len1;          将len赋值为len1,len2中大的那个 
	else
		len = len2;
	memset(a, 0, sizeof(a));  这是用内存设置函数置零字符串 
	memset(b, 0, sizeof(b));  这是用内存设置函数置零字符串 
							  两个for循环是将输入的两个字符串倒过来,再将字符串里的字符转换为数字赋值给a,b整型数组
	for (int i = len1 - 1; i >= 0; i--)    
	 a[len1 - i - 1] = s[i] - '0';        
	for (int i = len2 - 1; i >= 0; i--)   
	 b[len2 - i - 1] = ss[i] - '0';      
							  这里将上面逆序的数字进行相加再进行进位		
	for (int i = 0; i < len; i++)
	{
		a[i] = a[i] + b[i];    运算 
		a[i + 1] += a[i] / 10; 如有进位,在后一位上加上 
		a[i] = a[i] % 10;      原来那一位减掉进位了的 
	}
	if (a[len] != 0)           如果有进位就多显示一位
	 len++;                    位数就加一
   while (a[len - 1] == 0 && len > 1)  while去零法,将多余是0的位数去掉
   len--;		
   for (int i = len - 1; i >= 0; i--)  再逆序输出结果 
	  printf("%d", a[i]);
   printf("\n");
	return 0;
}

看了上面的大家可能还有疑惑下面有一些常见问题,希望下面的回答能帮助你解决疑惑


为什么大数要用字符串存呢?
因为大数太大,用任何整型变量都存不下,这个问题上面也解释过了
为什么要把字符串倒过来赋值呢?
因为大数与大数是一位一位运算的,还要涉及进位

总结:

大数相加分为一下几个步骤:
1.创立大的字符串数组和整形数组
2.计算位数和找到较大的位数
3.将整形数组置零
4.将字符串数组逆序再转化为整形数组
5.一位一位的进行运算并进行进位
6.如果有最高位进位就增加一位(判断易忘)
7.while去零
8.逆序输出

看看结果吧

在这里插入图片描述

结语

看到这里相信你已经掌握了这道题,为自己鼓掌吧!!!!

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在C语言中,我们可以使用数组来实现大数加法。首先,我们需要定义一个数组来保存大数的每一位数字,然后从个位开始进行逐位相加,并处理进位。 下面是一个使用C语言实现大数加法的示例代码: ```c #include <stdio.h> #include <string.h> #define MAX_DIGITS 1000 void addBigInt(char* a, char* b, char* result) { int lenA = strlen(a); int lenB = strlen(b); // 将数组初始化为0 int sum[MAX_DIGITS] = {0}; // 从个位开始逐位相加,并处理进位 int carry = 0; int i = 0; for (; i < lenA || i < lenB || carry != 0; i++) { if (i < lenA) { carry += a[lenA - 1 - i] - '0'; } if (i < lenB) { carry += b[lenB - 1 - i] - '0'; } sum[i] = carry % 10; carry /= 10; } // 将结果转为字符串形式 int lenSum = i; for (int j = 0; j < lenSum; j++) { result[j] = sum[lenSum - 1 - j] + '0'; } result[lenSum] = '\0'; } int main() { char result[MAX_DIGITS]; char factorial[MAX_DIGITS] = "1"; // 计算1!+2!+3!+...+50! for (int i = 2; i <= 50; i++) { char num[MAX_DIGITS]; sprintf(num, "%d", i); char temp[MAX_DIGITS]; addBigInt(factorial, num, temp); strcpy(factorial, temp); addBigInt(result, factorial, temp); strcpy(result, temp); } printf("%s\n", result); return 0; } ``` 在上述代码中,我们定义了一个`addBigInt`函数来实现大数相加。首先,我们通过`strlen`函数获取两个大数的长度,然后使用一个数组`sum`来保存每一位的和。接着,我们从个位开始逐位相加,并将进位保存在`carry`变量中,直到所有位数都相加完毕。 最后,我们将结果转换为字符串形式并打印出来。 运行上述代码,将会得到结果:333222235136048752564709397395796481570128393455295413410022。 注意:由于阶乘的结果非常大,所以要确保数组大小足够大来保存计算结果。以上代码中使用了`#define MAX_DIGITS 1000`来定义数组的大小。如果要计算更大的阶乘和,请相应增大数组的大小。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值