普通筛法
int prime[20000] = {0};
int c = 0;
void Getprime(int n){
prime[++c] = 2; // 易知2是一个质数;
for(int i =3; i <= n ; i ++) // 这里可以将i ++ 换成 i+= 2;因为偶数肯定不是素数(除2外)
{
int flag = 0;
for(int j = 2; j * j <= i ; ++ j){
if(i % j == 0){
flag = 1;
break;
}
}
if(!flag) prime[++ c] = i;//将筛出来的素数存入
}
}
简单粗暴的筛法,时间复杂度为O(N*sqrt(N)).
埃氏筛
bool isPrime[2000];
1.先定义一个布尔数组来记录一下质数;
for(int i = 2; i <= n ; i ++)
isPrime[i] = true;
2.假设全部都是质数
void getPrime(int n){
for(int i = 2; i <= n ; i ++)
isPrime[i] = true;
for(int i = 2; i <= n ; ++ i)
for(int j = i ; i * j <= n ; ++ j)
isPrime[i*j] = false;
}
核心思想:我的倍数不是质数
时间复杂度为O(n*log(logn));
缺点 : 判断了许多重复的数,比如:2*3,3*2.......之类的,重复检测就比较耗时。
欧拉筛
应该是埃氏筛的进化版,嘿嘿;
巧妙的解决了埃氏筛多次重复判断的缺点,话不多说,上代码!
int prime[2000];
int c = 0;
bool isvisit[20000];
void eulersevie(int n){
for(int i = 2; i <= n ; ++ i){
if(isvisit[i] == false)
prime[++ c] = i;
for(int j = 1; j <= c && i * prime[j] <= n; ++ j){
isvisit[i * prime[j]] = true;
if(i % prime[j] == 0)
break;
}
}
}
其中的for循环先是将“我的倍数”给洗白,排除,然后在再是循环的一个提前结束的出口,避免了埃氏筛的重复判断
小记一手学习心得,且看浅看