我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

大数相加(A+B)(超详细)!-创新互联

洛谷算法之大数相加
先看题目:

在这里插入图片描述

创新互联建站主要从事网站设计制作、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务长岭,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务: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)(超详细)!-创新互联
文章URL:http://shouzuofang.com/article/codcgp.html

其他资讯