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

洛谷算法之大数相加

先看题目:

大数相加(A+B)(超详细)!_第1张图片


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


#include
#include
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.逆序输出

看看结果吧

大数相加(A+B)(超详细)!_第2张图片

结语

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

你可能感兴趣的:(数据结构,算法,c++,开发语言)