在阅读“代码:计算机的隐藏语言”时,我遇到了作者所包含的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]
,如果它应该是真的,那么它将是假的。 j
或i
可以等于1吗?
我错过了什么吗?我将不胜感激任何帮助。
答案 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;
}