一、埃氏素数筛选法
- 时间复杂度O(N⋅loglogN)O(N\cdot\log{\log N})O(N⋅loglogN)
int prime[maxn],tot;
bool vis[maxn];
void get_prime() //埃氏素筛
{
memset(vis,0,sizeof(vis));
tot=0;
for(int i=2;i<=maxn;i++)
{
if(vis[i])
continue;
prime[++tot]=i;
for(int j=i;j<=maxn;j+=i)
vis[j]=true;
}
}
二、欧拉筛法(推荐)
- 时间复杂度O(N)O(N)O(N),故又称为 线性筛
埃氏素筛存在部分重复筛选,而欧拉筛对每个非素数只筛选一次,从而达到线性的时间复杂度。
int prime[maxn],tot;
bool vis[maxn];
void get_prime() //欧拉筛
{
memset(vis,0,sizeof(vis));
tot=0;
for(int i=2;i<=maxn;i++)
{
if(!vis[i])
prime[++tot]=i;
for(int j=1;j<=tot&&i*prime[j]<=maxn;j++) //筛去i*已有质数
{
vis[i*prime[j]]=true;
if(i%prime[j]==0) //控制筛选范围,防止重复筛选
break;
}
}
}

本文详细介绍了两种常见的素数筛选算法:埃氏素数筛选法和欧拉筛法。埃氏素筛的时间复杂度为O(N⋅loglogN),通过标记合数来找到所有小于等于N的素数。欧拉筛法是一种更高效的线性筛法,时间复杂度为O(N),通过对每个非素数只筛选一次,避免了重复工作,提高了效率。

4775

被折叠的 条评论
为什么被折叠?



