c++算法,大数加法

1,690 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

这是写给一些新人大学生的知识点,大神可以直接划走。

相信在大学时候打过算法竞赛的同学都已经在一开始接触过大数加法。有人会说,加法不是直接用+直接相加就行了吗?

的确例如 int a ; int b 直接相加可以得出 int c

如果数和小的话,的确是可以的但是如果数字是:100000000000000000000000000....省略几百位。

这样子的数字是int存不下的,就算你的int64最多也就存2的32次方-1这个数字已经是最大了,注意这里还有负数的存在,所以是2的32次方-1,而不是64次方。所以我们应该需要怎么办呢?

答案是数组,例如int a[300]这样的数字就可以存到300位数字。


        char s1[M], s2[M];
	int num1[M] = {0};           // 数字数组num1 
	int num2[M] = {0};           // 数字数组num2 
	scanf("%s %s", s1, s2);    
	
	len_s1 = strlen(s1);         //	求第一个加数的位数 
	len_s2 = strlen(s2);	     // 求第二个加数的位数 

直接开干,上面的M就是你自己定义的位数,这里你随意。一般定义100左右就行了,100位数,已经大得相当吓人。

        for(i=len_s1-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第一个加数 
	{
		num1[j] = s1[i] - '0';
		j++;
	}
	for(i=len_s2-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第二个加数 
	{
		num2[j] = s2[i] - '0';
		j++;
	}
	

将字符串转换为数字,需要-‘0’,然后最重要的一步就是为什么需要倒序呢?因为我们的加法就是从右到左的,1000+1000是0和0先加,而不是1和1先加,所以需要做一个倒序。如果整不明白的话,可以直接列出一条加法竖式就一目了然了。

        for(i=0; i<=M; i++)               //实现大数的加法 
	{
		num1[i] = num1[i]+num2[i];
		if(num1[i]>9)
		{
			num1[i] = num1[i]-10;
			num1[i+1]++; 	
		}	
	}

最后进行加法的模拟运算就行了,这里需要记得num1[i+1]++;进位操作,如果这个位置上面是大于等于10的数字,那么我们就需要进行进位。这也是在模拟我们的加法竖式而已。

image.png

上面是效果图。

上面的图,我只是随便写了两个数字,更复杂的数字也是可以计算出来的。

然后拓展思考一下,除了大数加法,我们还可以做大数减法,大数乘法,大数除法这些练习。原理不变,就是用数组来模拟平台的算数运算而已。

更加高阶一点的话,我们可以做带有小数点的运算。

欢迎和我讨论有关程序的问题,也可以答疑。关注公众号:诗一样的代码,交一个朋友。