关于大整数类加减法算法的一些思考

这几天做C++作业,有一道题要求实现大整数类,即不受内部数据类型表示范围限制的大数四则运算,比如123456789987654321987654321+9876543212345678987654321=?,看上去蛮吓人的呵呵,以前没有看过相关算法,开始做起来有点吃力,对于加减法运算我自己各想了一个算法,可以保证得到正确结果,加法的算法很简单,减法稍微有点烦,与大家一起分享。

另外关于大数类的乘除运算还没有想出好的办法,有时间再慢慢研究吧。
 
大数类加法:
1. 将123456789987654321987654321这样的大数用int型的数组存储(动态分配空间),
将其倒序存储,以便程序可以从低位开始处理,比如将123456存储为654321。
可以通过输入处理得到两个分别指向加数A和被加数B的int型指针 int *p, int *q。
2. 动态创建一个临时的int型数组C,其容量为A和B中长度较大者加1,加1的目的是
便存储可能在最高位产生的进位,将此附加位先置0,表示暂无进位。
3. 将A,B各位数字相加后存入C中的对应位,A,B位数不足用0代替。
4. 进位处理,对于此时C数组中的元素,可能是一位整数,也可能是两位。
举例:
求 987654321 + 5555555555 = ?
A: 123456789                 B:5555555555
C: 6 7 8 9 10 11 12 13 14 5 0
记C数组中有size个元素。
遍历C[0] 到C[size-2] ,对每个元素作如下处理:
a)       如果C[i] / 10 =1 , 则C[i+1] += 1;
b)      C[i] = C[i] % 10;
5.若C[size -1] 不为0,则C的倒序排列即为结果;C[size -1]为0,则C[0]到C[size-2]的倒序排列即为结果。
 
大整数类的减法:
1. 此步骤同加法第一步。
2. 动态创建一个临时的int型数组C,其容量为A和B中长度较大者。
3. 首先判断A,B两数哪个较大,判断过程应该很简单了,这里就不赘述了,若A大,置结果符号标识flag为0,表正数,否则置1,表负数。
4. 将A,B中较大者逐位复制到C中,根据2中,此时C空间刚好够用。
5. 将A, B中较小者逐位取相反数与C中对应位相加。不足位用0代替
6. 借位处理,对于此时C数组中的元素,可能是一位正整数,也可能是一位负整数。
举例:
求 987654321 - 55555555555 = ?
结果符号标识op = 1,结果为负。
A:   123456789                   B:55555555555
C:         4   3   2   1   0    -1   -2   -3   -4   5     5
索引:0    1   2   3   4    5     6    7    8    9    10
7. 定义两个标记量 i,j。
从C的高位开始找到第一个非正数的索引,i为其索引加1;
从低位开始找第一个负数位,j为其索引。
上例中i=9, j=5;
8. 如果i=j 则C倒序排列加上结果符号标识即为结果。
如果i!=j 则先将C[j]加10,C[i]减1。
遍历C[j+1]到 C[i-1]的元素,记循环因子为k,对每个元素作如下处理:
a)       如果C[k] 大于0则 C[k] = C[k]-1; C[k+1] = C[k+1] +1;
b)      如果C[k] 小于等于0则 C[k] = C[k] + 9;
c)      C的倒序排列加上结果符号标识即为结果。
9.对于6中的例子:
  A:123456789                 B:55555555555
C:            4 3 2 1 0  -1  -2  -3  -4   5   5   (old)
C:            4 3 2 1 0   9   7   6   5    4   5   (new)
则987654321 - 55555555555 = -54567901234
 
以上就是大数类的加减算法了,有什么考虑不周的地方,欢迎大家指正哈。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值