质数筛选法:Eratosthenes筛选法与欧拉筛选法
Posted zhenglijie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了质数筛选法:Eratosthenes筛选法与欧拉筛选法相关的知识,希望对你有一定的参考价值。
第一种:开根号,这里不再重述
第二种:Eratosthenes筛选法
原理:利用倍数,讲非素数筛选掉
code:
1 int vis[maxn]; 2 void Prime() 3 { 4 vis[0] = 1; 5 vis[1] = 1; 6 for(int i = 2; i <= maxn; i++) //任何数的倍数都标记为1证明其不是素数 7 { 8 if(!vis[i]) 9 { 10 for(int j = i*2; j <= maxn; j += i) 11 { 12 vis[j] = 1; 13 } 14 } 15 } 16 }
第二种:欧拉筛法
原理:每个合数都会被它的最小因子筛掉,而我们的最小因子即记录在 Prime 数组(就是拿已经筛选出来的素数乘当前的数i,结果即为合数,筛掉),详细看代码注释
code:
1 bool vis[100001]={1,1};//0,1均既不是素数,也不是和数,所以先标记为不是 2 int Prime[100001],k; 3 void prime(long long num) 4 { 5 for(int i=2;i<=n;i++)//最小的素数是2 6 { 7 if(!vis[i]) 8 { 9 Prime[++k]=i;//如果是素数就标记一下 10 } 11 for(int j=1;j<=k;j++)//j小于当前所有的素数的个数 12 { 13 if(Prime[j]*i>num)//如果已经大于最大的范围也没必要再往后筛选了 14 { 15 break; 16 } 17 vis[Prime[j]*i]=true;//用素数依次×i,结果标记为合数 18 if(i%Prime[j]==0) //每个数被它的最小因子晒掉 筛掉就break即可 19 { 20 break; 21 } 22 } 23 }//欧拉筛法,就是拿当前的数×之前的筛出来的素数,这个数即为合数 24 }
以上是关于质数筛选法:Eratosthenes筛选法与欧拉筛选法的主要内容,如果未能解决你的问题,请参考以下文章