biz*_*lop 12
如果您在列表中添加了1,那么您的答案已经错了:)
无论如何,Erathosthenes的筛子是你应该开始的地方,它非常简单而且效率很高.
一旦你熟悉了筛子的概念以及它们的工作原理,你就可以继续使用Atve的Sieve,这有点复杂但显然更有效率.
关键事项:
埃拉托色尼的简单筛子就像拍板一样运行。在我的盒子上,不到一秒就可以计算出第 1,000,000 个素数:
class PrimeSieve
{
public List<int> Primes;
private BitArray Sieve;
public PrimeSieve(int max)
{
Primes = new List<int> { 2, 3 }; // Must include at least 2, 3.
Sieve = new BitArray(max + 1);
foreach (var p in Primes)
for (var i = p * p; i < Sieve.Length; i += p) Sieve[i] = true;
}
public int Extend()
{
var p = Primes.Last() + 2; // Skip the even numbers.
while (Sieve[p]) p += 2;
for (var i = p * p; i < Sieve.Length; i += p) Sieve[i] = true;
Primes.Add(p);
return p;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:筛选最佳地从 p^2 开始,而不是 2p,正如 Will Ness 正确指出的那样(所有低于 p^2 的复合数都将在早期迭代中标记)。
归档时间: |
|
查看次数: |
11064 次 |
最近记录: |