大数相加(A+B)(超详细)!-创新互联
洛谷算法之大数相加
名称栏目:大数相加(A+B)(超详细)!-创新互联
分享路径:http://scyanting.com/article/codcgp.html
先看题目:创新互联建站主要从事网站设计制作、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务长岭,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
思路分析:
看a和b的取值范围是(0至10的500次方)在c语言中就算用unsigned long long int(0至2的64次方)也超出了范围,因此这道题不能简单的用数学中的加法直接相加,这里就引出字符串数组来计算和储存,下面直接上代码并附带分析。
#include#includeint main()
{char s[10000],ss[10000]; 这里的范围我们设大一些,最多就放10000个数(10的10000方)
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.逆序输出
结语
看到这里相信你已经掌握了这道题,为自己鼓掌吧!!!!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
名称栏目:大数相加(A+B)(超详细)!-创新互联
分享路径:http://scyanting.com/article/codcgp.html