大数运算-加法
前言
- 在很多情况下,c/c++所提供的基本数据类型已经不能满足我们的需求了,所以我们需要一种方法来解决一些大数的运算,在小学进行加法运算的时候,无论数据是什么,有多少位,都通通采取列竖式的方法进行计算并得出结果,本文将使用数组模拟列竖式计算来解决大数的加法运算。
问题分析
- 首先我们先给定一组数据,来辅助说明整个计算过程
- a = 987654321
- b = 56789
- 计算 a + b 的结果
- 将两个数字的每一位分别存入两个数组:因为所给定的数据不是很大,这里就开辟长度为10的数组进行说明,a数组(a[])用来存储数字a的每一位,b数组(b[])用来存储数字b的每一位,c数组(c[])用来存储计算的结果(在程序中开辟一个新的数组,数组的每一位都是随机数,所以需要将数组初始化,把数组的每一位都赋值为0)。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
a[] | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
b[] | 5 | 6 | 7 | 8 | 9 | 0 | 0 | 0 | 0 | 0 |
c[] | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 我们通过某种方式将其存入了数组中,从左往右观察上面这个表格,虽然我们想计算的是987654321 + 56789,但是存入数组中后我们发现,现在已经无法分辨 a 和 b 的值了。
- a 的值变成了9876543210?
- b 的值变成了5678900000?
- 我们可以记录下数字 a 最后一位所在数组的位置,数字 b 最后一位所在数组的位置,这样虽然不会出现上面的问题了,但是在实际的计算过程中会很繁琐,并伴随着各种问题。接下来,我们换一种思路来将数字存入数组(逆序存入),存入的结果如下表所示:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
a[] | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
b[] | 9 | 8 | 7 | 6 | 5 | 0 | 0 | 0 | 0 | 0 |
c[] | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 此时我们从右往左看这个表:
- a = 0987654321 = 987654321
- b = 0000056789 = 56789
- 这样的结果才是我们所需要的,接下来我们继续来模仿列竖式的方法进行计算,c[n] = a[n] + b[n] + c[n], 如果结果大于等于10,我们就向前进一位。
- c[0] = a[0] + b[0] + c[0] = 1