无限大数值相加的算法

这是一个无限大数值相加的算法
网上有很多大数值相加的算法,但是大部分都是基于模拟10进制加法。
思路基本正确,但是效率太低。因为他们的模拟都是基于10进制的一位进行计算。这样不能充分利用cpu的计算能力。
我的思路是,直接使用长整型可以表示的最大十进制数作为基础进行运算。
对于长整型,最大可以表示的数值为:9223372036854775807(即2^63 -1),共19位。
对于10进制的18位数,最大值为:999999999999999999,两个18位10进制的最大数值相加,得到的数值为:
1999999999999999998,因此两个18位数值相加,肯定不会超过长整型所能表示的最大数值。
这样我们就可以把大数值没18位拆分出来,作为一个长整型数值进记录。做加法时对应位置的长整型数值分别相加,
并把超出18位的部分作为进位,加到高位的长整型数值上去。
超出18位的部分,只可能是1^19,这个可以通过递推的方式得到。证明如下:
对于第一个18位,最大的数值为999999999999999999,两者相加为1999999999999999998,进位值为1;
对于第二个18位,最大的数值为999999999999999999,两者相加为1999999999999999998,加上第一个18位的进位值1,
为1999999999999999999,进位值仍然是1。
以此类推,进位值只可能是1。

基于以上说明,我们对大数值相加作如下处理:
1、每个数值均以18位10进制为单位进行拆分,拆分之后按顺序存储入一个长整型数组中。
2、做加法运算时,每一个长整型数组元素分别相加,统计判断是否超过999999999999999999,如果超过,则记录进位值,
同时结果减去1^19。
3、后续的计算加上前一步计算的进位值。
4、输出计算结果是,每一位分别输出为10进制然后拼接起来就可以了。

明天发程序及测试结果。

posted on 2015-05-19 22:38  我是刘斌  阅读(726)  评论(0编辑  收藏  举报

导航