线性筛(筛素数)

用筛法求素数的基本思想是:把从1开始的、某一范围的正整数从小到大排列,1不是素数,首先把它筛掉。剩下的数中选择最小的是素数的数,然后筛掉它的倍数。以此类推直到结束。

int vis[MaxN];

void Sieve()
{
    for(int i = 2;i <= MaxN;i++)
    {
        if(vis[i]) continue;
        for(int j = 2*i;j <=MaxN;j += i)
        {
            vis[j] = 1;
        }
    }
}

如果 vis [i] == 0,则 i 为素数。

时间复杂度的计算:

对于挑选素数的方法:

一层循环 n 次,根据素数定理,即小于 m 的所有数中有 m/ln(m) 个素数。在算法中为 sqrt(n) / ln(sqrt(n)),于是时间复杂度为 O(n*sqrt(n) / lg(n))。

对于素数筛的方法:

同上。

原文地址:https://www.cnblogs.com/Lightfall/p/9308144.html