非常简单的思想,就是假定区间[1, n]内的所有数都是素数,再去掉所有合数,剩下的就是所有素数。
其大致的代码如下:
void EratoSieve(int A[ ], int n)
{
int i, j;
for (i = 2; i <= n/2; i++)
{
if (A[i] != 0) continue;
else
{
for (j = 2; i * j <= n; j++)
A[i*j] = 1;
}
}
}
最开始接触这个算法的时候,有一个小小的疑惑—— 为什么只用筛前一半的就够了?对应的代码就是 for (i = 2; i <= n/2; i++) 这一行代码。
经过思考,可以设想一下,到了一半后是否需要继续筛选呢?
答案显然是不需要,筛选的规则是筛选掉素数的倍数,起码也是两倍。
故而对于大于n/2的数,两倍后已经超出了所给范围n,完全没有必要。