大数运算-减法
前言
- 上一篇中已经介绍了大数运算的加法(如果没有看过上一篇,请先看一下上一篇,再继续看关于减法的讲解),是通过模拟列竖式的方法实现的,大数运算的减法实际上也是通过模拟列竖式来进行计算的,只是把‘+’号变成了‘-’号,进位变成了借位,接下来,让我们开始吧。
问题分析
- 和加法一样,首先我们先给定一组数据,来辅助说明整个计算过程,在减法中,可能会出现一个小的数字减去一个大的数字形成负数的情况,我们先不考虑那样的情况,只考虑式 a - b 中 a >= b 的情况。
- a = 192837465
- b = 3456789
- 计算 a - b 的结果
- 数字 a 和数字 b 的值都不是很大,这里就开辟长度为10的数组进行说明,a数组(a[])用来存储数字 a 的每一位,b数组用来存储数字 b 的每一位,c 数组用来存储计算的结果,在讲述加法运算的时候,我们已经讲解过正序存储的一些问题,并采用了逆序存储避免了问题的出现,对于减法来说,同样采取逆序存储的方式。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
a[] | 5 | 6 | 4 | 7 | 3 | 8 | 2 | 9 | 1 | 0 |
b[] | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 0 | 0 | 0 |
c[] | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 可以看到,当逆序将数字存入之后,会呈现这样一个表,接下来我们来模仿列竖式的计算,对这个表进行操作,我们还需要记录每次计算是否需要从前面借位,所以我们再引入一个变量 bit,当bit = 1时,说明借位了,当bit = 0时,说明并未借位。
- 不要因为下面这些东西看起来很复杂而不去看,实际上逻辑是很简单的。
- a[0] = 5, b[0] = 9, 此时 a[0] < b[0],需要从前面借一位,因为需要借位,所以 bit 置为 1,此时a[0]经过借位之后变成 a[0] = 15,c[0] = a[0] - b[0] = 15 - 9 = 6;
- 因为bit = 1,所以a[1]的值并不是 6,经过借位之后变成了 5,即 a[1] = a[1] - bit,a[1] = 5,b[1] = 8,此时 a[1] < b[1],需要从前面借一位,因为需要借位,所以bit置为 1,此时a[1]经过借位之后变成了a[1] = 15,c[1] = a[1] - b[1] = 15 - 8 = 7;
- 因为bit = 1 ,所以a[2]的值并不是 4,经过借位之后变成了 3,即a[2] = a[2] - bit, a[2] = 3,b[2] = 7, 此时a[2] < b[2], 需要从前面借一位,因为需要借位,所以bit置为1,此时a[2]经过借位之后变成了a[2] = 13,c[2] = a[2] - b[2] = 13 - 7 = 6;
- 因为bit = 1 ,所以a[3]的值并不是 7,经过借位之后变成了6,即 a[3] = a[3] - bit, a[3] = 6,b[3] = 6,此时a[3] = b[3],不需要从前面借一位,因为不需要借位,所以bit置为0,c[3] = a[3] - b[3] = 0;
- 因为bit = 0,所以a[4]的值还是3,即a[4] = a[4] - bit,a[4] = 3, b[4] = 5,此时 a[4] < b[4],需要从前面借一位,因为需要借位,所以bit置为1,此时a[4]经过借位之后变成了a[4] = 13,c[4] = a[4] -