素数筛

题意:筛选出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 }
原文地址:https://www.cnblogs.com/yanchaoyi/p/9722157.html