代码之家  ›  专栏  ›  技术社区  ›  James King

使用大于最大十进制值的数字

  •  3
  • James King  · 技术社区  · 14 年前

    我在研究前26个素数的乘积。这需要超过52位的精度,我相信这是一个双精度可以处理的最大值,超过了一个十进制可以提供的28-29位有效数字。那么,对这么大的数执行乘法和除法有什么策略呢?

    另外,无论我要跳到什么样的篮筐里才能做到这一点,对我的表现会有什么影响呢?

    前22个质数的乘积(我在计算器上最多可以乘在一起,而不必陷入科学模式)是:

    10,642,978,845,819,148,849,204,664,294,430
    

    最后四个的乘积是

    72,370,439
    

    当乘以一起,我得到:

    7.7023705133964511682328635583552e+38
    

    性能影响在这里特别重要,因为我们本质上试图解决质数字符串比较解决方案在实践中是否比字符的直接比较快的问题。促使这项调查的是 here . 处理器针对浮点计算进行了优化;理想情况下,我希望在最终得到的任何解决方案中尽可能多地利用这种优化。

    蒂亚!
    詹姆斯

    注:我所拥有的代码是一个竞争性的解决方案;我不认为质数解决方案可能更快,但我正在尽力给它一个最公平的机会。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Cheng Chen    14 年前

    你可以用 BigInteger 在C#4.0中。对于较旧的版本,我认为您需要一个开源库,如 this one

        2
  •  0
  •   I. J. Kennedy ShankarSangoli    14 年前

    我读了你链接到的关于面试问题的帖子。因为你只是在乘和除这些大整数,所以 巨大的 优化就是保持它们的素分解形式。每个大整数是一个整数数组[0..25],每个元素表示因子分解中第n个素数的指数。若要将此形式的两个大整数相乘,只需逐个元素添加指数即可;若要除数,则减去指数即可。

    但您将看到这相当于在两个字符串上列出字符数。