众多筛法中最简单且容易理解的一种,时间复杂度为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;
        }
    }
}