在数十亿的数字中找出素数

时间:2014-10-20 09:15:42

标签: algorithm

我在某个地方遇到了一个问题,但对我的回答并不满意。

QTN: 你给出了一个数字列表,可以是100亿个数字。 现在你必须找出所有这些中最重要的一个。

我回答说,为了找到一个素数,我们不得不遍历数十亿的循环 并逐一检查天气是不是。 我们可以在这里进行一些优化检查,如果不是甚至我们都不会检查,因为素数不能是偶数。 并且存储no我们可以使用double数组,因为double是8字节的大小所以它也可以处理十亿个数字。 但似乎他还不满意。 请在这里帮助这里可能更合理的答案。 谢谢!

1 个答案:

答案 0 :(得分:0)

假设我们将素数存储在数组中。根据{{​​3}}:

  1. 创建一个从2到10的连续整数列表:(2,3,4,....,10¹⁰)。
  2. 最初,让 p 等于2,即最小的素数。
  3. 通过以 p 为增量从 2p 计数10¹⁰来枚举 p 的倍数,并标记它们在列表中(这些将是 2p 3p 4p ,....; p 本身应该没有标记)。
  4. 在数组中插入 p
  5. 在未标记的列表中找到大于 p 的第一个数字。如果没有这样的号码,请停止。否则,让 p 现在等于这个新数字(这是下一个素数),并从步骤3开始重复。
  6. 当算法终止时,您将在阵列中存储10 10以下的所有素数。

    实施例

    要查找小于或等于20的所有素数,过程将为:

    首先生成一个从2到20的整数列表:

      

    2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

    列表中的第一个数字是2;通过从2开始以2为增量从2开始计算,将列表中的每个第2个数字交叉出来(这些将是列表中2的所有倍数):

      

    2 3 4 5 s <6> 7 8 9 10 s / s> 12 13 14 15 16 17 18 19 20

    2之后列表中的下一个数字是3;通过从3开始以3为增量从3开始计算,从而将列表中的每第3个数字删除(这些将是列表中3的所有倍数):

      

    2 3 <4> 5 6 7 s <8> 9 10 s / s> 11 12 13 14 15 16 18 19 20 < / p>

    3之后列表中尚未划掉的下一个数字是5;通过从5开始以5的增量(即5的所有倍数)计数,在5中的每5个数字后面划出,但是这些数字(10,15,20)也是倍数,因此它们都被划掉了。较小的素数因为5 * 5大于20.此时列表中没有划掉的数字都是低于20的素数:

      

    2 3 5 7 11 13 17 19

    为了提高效率,正如您所说,您最初只能列出奇数,(3,5,....,10⁹),并以 2p 的增量从< em>p²在步骤3中,因此只标记 p 的奇数倍。

    另一种提高效率的方法是,从开始标记步骤3中的数字,因为 p 的所有较小倍数都已标记为点。这意味着当大于10¹时,允许算法在步骤5终止。

    如果内存不足并且需要在较小的范围内生成素数,您还可以查找分段扫描