3.1 筛法
Posted orange-233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.1 筛法相关的知识,希望对你有一定的参考价值。
埃氏筛法
- 先将2到n范围内的整数列出来,其中2是最小的素数。
- 将表中所有的2的倍数划去,表中剩下的最小的数字就是3,他不能被更小的数整除,所以3是素数。
- 再将表中所有的3的倍数划去……以此类推;
- 如果表中剩余的最小的数是m,那么m就是素数。
- 然后将表中所有m的倍数划去,像这样反复操作,就能依次枚举n以内的素数。
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | 3 | - | 5 | - | 7 | - | 9 | - | 11 | - | 13 | - | 15 | - | 17 | - | 19 | - |
2 | 3 | - | 5 | - | 7 | - | 9 | - | 11 | - | 13 | - | - | - | 17 | - | 19 | - |
- 时间复杂度为(O(nlog(logn)))
- 样例代码如下
bool h[10000005]={0}
void E(int n)
{
for(int i=2; i<=n; i++)
{
if(h[i]) continue;
for(int j=2; j*i<=n; j++) h[j*i]=1;
}
}
例:给定一个正整数n(n<=10^6),问n以内有多少个素数?
int prime[MAXN];//第i个素数
bool is_pri[MAXN+10];//is_pri[i]表示i是素数
//返回n以内素数的个数
int sieve(int n)
{
int p=0;
for(int i=0;i<=n;i++) is_pri[i]=true;
is_pri[0]=is_pri[1]=false;
for(int i=2; i<=n; i++)
{
if(is_pri[i])
{
prime[++p]=i;
for(int j=2*i; j<=n; j+=i) is_pri[j]=false;
}
}
return p;
}
以上是关于3.1 筛法的主要内容,如果未能解决你的问题,请参考以下文章