• 无限大数值相加的算法


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

    明天发程序及测试结果。

  • 相关阅读:
    Django 的 CSRF 保护机制
    操作系统下spinlock锁解析、模拟及损耗分析
    .Net中的并行编程-1.路线图(转)
    [leetcode] 小心成环
    [leetcode] 题型整理之图论
    [leetcode] 提醒整理之进制
    [leetcode] 题型整理之二叉树
    [leetcode] 题型整理之查找
    [leetcode] 一些会的
    [leetcode] 题型整理之排序
  • 原文地址:https://www.cnblogs.com/liu-binq63/p/4515780.html
Copyright © 2020-2023  润新知