4

在某些情况下,程序员需要或想要找到非常大的数字。它们通常很大,以至于无法理解程序员的理解。我说的是最大的已知素数(有 12978189)和最近计算的10 万亿位 pi

您如何创建处理这些问题的程序?这远远超过了整数、long、double、BigInteger、BigDecimal 或任何类似的东西。这些用于发现这些数字的程序是如何创建的?当不存在合适的数据类型时,你怎么能将它们存储在内存中,并且它们每个都可能消耗千兆字节的数据?

4

2 回答 2

4

要解决您的具体示例:

  • 对于一个典型的“大整数”类来说,一个 1200 万位的整数并不是特别大。这应该能够存储在内存中。

  • 要存储 10 万亿位的 π,您可以使用磁盘文件并对其进行内存映射。你需要一个 64 位操作系统和应用程序,但你可以简单地在磁盘上创建一个 10 TB 的文件(你可能需要一些磁盘和像ZFS这样可以跨磁盘存储它的文件系统),并将其映射到 CPU 地址空间。计算 π 的算法(例如BBP)方便地一次计算一个十六进制数字,这很适合半字节的内存。

于 2012-11-24T18:35:13.950 回答
0

(抽象的)答案是使用机器的本机类型编写算法,以产生您想要的结果。例如,当您在纸上对两个非常大的整数进行手动加法时,您需要的最大实际计算量仅为 9+9+1(进位为 9 加 9 加 1)。当然,你需要足够大的纸来首先写下这两个数字,然后再写下答案。因此,只要两个数字和答案可以存储在计算机的硬盘(论文)中,就可以编写一个算法来处理只需要一个高达 19 的值的变量;因此,即使是char变量也能够处理这个问题,更不用说int变量了。

(具体的)答案是,真正优秀的程序员已经这样做了,甚至还有 FOSS 库。一个很好的是 GNU 项目的GMP 库,它有很多函数来处理任意大小的整数运算和任意精度的浮点运算。所以只要你的电脑能存储计算时需要的信息,就可以完成。当然,您需要花时间阅读文档。

于 2020-04-14T05:42:41.850 回答