大数运算-减法(C/C++实现)

大数运算-减法

前言
  • 上一篇中已经介绍了大数运算的加法(如果没有看过上一篇,请先看一下上一篇,再继续看关于减法的讲解),是通过模拟列竖式的方法实现的,大数运算的减法实际上也是通过模拟列竖式来进行计算的,只是把‘+’号变成了‘-’号,进位变成了借位,接下来,让我们开始吧。

问题分析
  • 和加法一样,首先我们先给定一组数据,来辅助说明整个计算过程,在减法中,可能会出现一个小的数字减去一个大的数字形成负数的情况,我们先不考虑那样的情况,只考虑式 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] -
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值