素数筛
题意:筛选出1~n的所有素数
普通筛法
基本思想:素数的倍数一定不是素数
时间复杂度:O(N*loglogN)
不足:一个合数可能被筛选多次,如6可被2和3筛选出来。
void Prime ()
{
memset(check,0,sizeof(check));//用来标记是否是合数
for(int i=2; i <= N; i++)
if(check[i]==0){
prime[ct++]=i;//存储素数
for(int j=i+i;j<=n;j+=i)
check[j]=1;
}
}
线性筛(欧拉筛法)
时间复杂度:O(N)
原理:保证每个合数只被它最小的那个质因子筛选。i如果能整除prime[j],则i肯定是合数,i中有质因子小于或者等于prime[j],所以到此终止,后面的prime[]会比i的那个质因子大
void Prime(){
memset(check,0,sizeof(check));
int cnt=0;
for(int i = 2; i<N; i++){
if(!check[i])
prime[cnt++]=i;
for(int j=0;j<cnt && prime[j]*i<N; j++){
check[i*prime[j]] = 1;
if(i % prime[j]==0)
break;
}
}
}