素数筛法

int m = sqrt(n + 0.5);
memset(vis, 0, sizeof(vis));
for(int i = 2; i <= m; i++) if(!vis[i])
   for(int j = i * i; j <= n; j += i) vis[j] = 1;

 上述算法已经很高效了而且便于编写,如果还想进一步加速也可以使用线性筛

int pri[N], tot, np[N];
void sieve()
{
    np[1] = 1;
    for (int i = 2; i <= n; i++)
    {
        if (!np[i]) pri[++tot] = i;
        for (int j = 1; j <= tot && i * pri[j] <= n; j++)
        {
            np[i * pri[j]] = 1;
            if (i % pri[j] == 0) break;
        }
    }
}

 

posted @ 2019-06-10 10:51  Hanasaki  阅读(82)  评论(0)    收藏  举报