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