这个程序是否找错了素数?

时间:2014-01-11 10:42:09

标签: primes algol

在阅读“代码:计算机的隐藏语言”时,我遇到了作者所包含的ALGOL程序,使用Sieve算法查找到10,000的素数。下面是代码。

begin
   Boolean array a[2:10000];
   integer i, j;

   for i :=2 step 1 until 10000 do
       a[i] :=true;

   for i :=2 step 1 until 100 do
       if a[i] then 
            for j := 2 step 1 until 10000 / i do
                a[i*j] :=false;
   for i :=2 step 1 until 10000 do
       if a[i] then
           print(i);
end

当我经常看到一个程序时,我会使用实际值来测试它的有效性。在这种情况下,我所关注的是行For j:=....。如果我们将i作为3和3作为j步骤中的特定点。然后j将是1.因此,a[i*j],即a[3],如果它应该是真的,那么它将是假的。 ji可以等于1吗?

我错过了什么吗?我将不胜感激任何帮助。

2 个答案:

答案 0 :(得分:1)

for j := 2
         ^

j从2开始,因此只有非素数的索引(i * 2,i * 3,...)才会在数组中设置为false

答案 1 :(得分:0)

如果有人对此感兴趣,这里有一个稍微快一点的算法实现

#include <iostream>
#include <vector>
using namespace std;
long long sumPrime(long long n){
   
    vector<long long> isPrime(n+1,true);
    for (long long i = 2; i <= n; i++) {
        if(isPrime[i]){
            cout<<i<<" ";
        }
        for (long long j = i*i; j <= n; j=j+i) {
            isPrime[j]=false;
        }
    }
    
}



int main() {
    cout<<sumPrime(2000000);
    return 0;
}