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

大数相加(A+B)(超详细)!洛谷算法之大数相加 先看题目 思路分析 看 a 和 b 的取值范围是 0 至 10 的 500 次方 在 c 语言中就算用 unsigned long long int 0 至 2 的 64 次方 也超出了范围 因此这道题不能简单的用数学中的加法直接相加

大家好,我是讯享网,很高兴认识大家。

洛谷算法之大数相加

先看题目:

在这里插入图片描述
讯享网


思路分析:
看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.逆序输出

看看结果吧

在这里插入图片描述

结语

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

小讯
上一篇 2025-01-17 09:34
下一篇 2025-01-12 09:35

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/66896.html