您的位置:首页 > 其它

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

2006-11-04 21:38 459 查看
这几天做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

以上就是大数类的加减算法了,有什么考虑不周的地方,欢迎大家指正哈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: