无限(或非常高)长度整数存储

时间:2010-06-23 14:31:30

标签: storage integer

作为一个侧面项目我正在研究一些自制的素数问题,尝试编写一些不同的实现作为自学C和C ++的方法。当然,生成低质数的最快方法是已经拥有它们,所以我想设置一个硬盘主列表数据文件。我想编写所有生成素数的代码,但我对使用已经存储的方法没有任何疑虑。在实际编码方面,我的经验很少,但理解大部分理论。 (请注意,对于大多数情况,我将讨论数学整数,而不是int变量)

所以我向你们提出一些问题,专家们:

1)天真的方法只是在生成时对二进制写整数。但是,在我脑海中,我想象一个列表,其中的项目由某种标志分隔,因此可以存储大于32位的整数(如果我到达那一点)。这显然是低效的,但是数组[4723,12782,8357]的原始数据看起来像4723F12782F8357,即数字存储在十进制中,每位16位,并用F分隔。显然,ABCDE数字可能性的数据将不被使用,因此它不是一个非常有效的系统,但你明白我的意思。随着数字越来越长,这也会变得越来越有意义,因为在任何固定长度系统中任何一个最小的条目都必须与最大的条目一样大。我确信必须有用C或C ++编写的能够有效地完成这项任务的东西。

2)另一种可能性是长度声明系统,其中在存储每个整数之前,固定长度(假设1字节)数据片段声明整数将以多长时间(以位为单位)。这显然与前一个选项具有相似的优势,并且不会浪费数字可能性。

有谁知道如何存储此类数据?是否有一个变量类型,我可以存储素数,以免进入大小限制?更好的是,以简单可检索的格式将简单的整数列表存储到硬盘的最有效方法是什么?

2 个答案:

答案 0 :(得分:5)

不要重新发明轮子。如果你正在处理大素数,你几乎肯定需要一个BigNum库,比如GMP(http://gmplib.org/)。 GMP BigNums有序列化方法,因此您可以使用它们轻松地将它们写入磁盘并从磁盘读取它们,让您可以自由地思考算法。

答案 1 :(得分:0)

在Ubuntu上使用g ++编译器,我发现long int是32位,long long是int 64。

我正在计算已知梅森素数的完美数,将数字保存在不同长度的long int数组中;这意味着你可以在进行长乘法,长除法等时使用long long int作为临时变量。我还将每个long中的值限制为不超过999,999,999,这样可以很容易地打印答案。