埃拉托斯特尼筛法虽然已经将时间复杂度降低到O(n*logn),但是还是有不足之处。
因为6在i=2时就被标记了,而在i=3的时候又被标记了一次,所以还是有改进的空间。
const int N=1e6+5;
int cnt=0,prime[N],n;
int vis[N];
void get_prime()//打素数表 普通筛法
{
memset(vis,0,sizeof(vis));//假设都是素数
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
for(int j=i+i;j<=n;j+=i)//倍数
vis[j]=1;
}
}
}
线性筛法–欧拉筛法O(n)
const int N=1e6+5;
int cnt=0,prime[N],n;
int vis[N];
void get_prime()//打素数表 线性筛法
{
memset(vis,0,sizeof(vis));//假设都是素数
for(int i=2;i<=n;i++)//i是倍数
{
if(!vis[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<=n;j++)//针对每个已得的素数
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)//倍数i判断
break;
}
}
}