zoukankan      html  css  js  c++  java
  • 无限大数值相加的算法

    这是一个无限大数值相加的算法
    网上有很多大数值相加的算法,但是大部分都是基于模拟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进制然后拼接起来就可以了。

    明天发程序及测试结果。

  • 相关阅读:
    Oracle等待事件Enqueue CI:Cross Instance Call Invocation
    Exadata. Are you ready?
    Beyond the Mobile Goldrush
    推荐一款性能诊断工具Membai
    Does LGWR use synchronous IO even AIO enabled?
    Raid Level,该如何为Oracle存储选择才好?
    Oracle备份恢复:Rman Backup缓慢问题一例
    Usage and Configuration of the Oracle shared Server
    UserManaged Backups
    Oracle Recovery Manager Overview and Configuration
  • 原文地址:https://www.cnblogs.com/liu-binq63/p/4515780.html
Copyright © 2011-2022 走看看