我的 Eratosthenes 筛遇到了问题。我想写一个筛子,它不需要所有数字的数组,直到你想要的最大素数,而只是在筛子到达它时跟踪每个素数倍数。这意味着您不必预先完成所有工作,而可以在需要时确定下一个素数。添加诸如“从 N 开始查找 K 个素数”之类的界面功能也很容易。这是伪代码:
Begin with current number set to 2
Loop:
If prime queue is not empty:
Peek at the top prime in the queue
If current > top, we can move top to the next multiple
Remove the top prime from the prime queue
Increment top to its next multiple
Re-add it to the queue
If current == top, current is not a prime
Increment current number to next integer
If current < top, we've found a prime
Break
Push current number onto prime queue
Increment current number to next integer
Return the new prime
所以问题来了:我正确计算了前 31 个素数(最多 127 个),但之后它认为每个数字都是素数。我已经把我的代码放在了 Ideone 上——我希望它是一些 Java 集合行为,或者一个微不足道的错误,而不是算法本身。我想不出算法应该在一定数量的素数后中断的原因。我已经手动确认在 127 之后,如果堆的排序正确,我的算法应该将 128 识别为不是素数,但这不是代码向我显示的。
有什么建议么?
(当然,一旦我得到基本算法的工作,我会增加 2(以跳过所有非素数偶数)。我可能还会使 Sieve 成为可迭代的。)