1.朴素算法 O(nlogn)
void get_primes1(){
for(int i=2;i<=n;i++){
if(!st[i]) primes[cnt++]=i;//把素数存起来
for(int j=i+i;j<=n;j+=i){//不管是合数还是质数,都用来筛掉后面它的倍数
st[j]=true;
}
}
}
2.2.诶氏筛法 O(nloglogn)
void get_primes2(){
for(int i=2;i<=n;i++){
if(!st[i])
{
primes[cnt++]=i;
for(int j=i+i;j<=n;j+=i) st[j]=true; //将该循环放在判断条件里,剪短时间,可以用质数就把所有的合数都筛掉;
}
}
}
3.线性筛法 O(n)
void get_prime3(int n)
{
for(int i=2;i<=n;i++)
{
if(!s[i])
{
prime[m++]=i;
}
for(int j=0;prime[j]<=n/i;j++)
{
s[prime[j]*i]=true; //用最小质因数筛合数
if(i%prime[j]==0) //
break;
}
}
}
【无标题】筛素数的三种解法
于 2022-04-03 14:41:38 首次发布