众多筛法中最简单且容易理解的一种,时间复杂度为O(nloglogn),在找到一个素数后,马上将所求范围内该素数的倍数标记为合数。埃氏筛法存在的问题是会对同一合数进行多次标记,从而影响效率。
const int maxn = 101; // 表长
int prime[maxn], pNum = 0; // prime存放素数,pNum为素数个数
bool p[maxn] = {false}; // 标记,素数false,合数true
void eratosthenesSieve(int n)
{
for (int i = 2; i <= n; i++)
{
if (p[i] == false) // 如果i是素数
{
prime[pNum++] = i; // 记录i
for (int j = i + i; j <= n; j += i) // 筛去所有i的倍数
p[j] = true;
}
}
}