学习笔记——素数筛法
素数的定义:除了1和它本身的所有数都不能将它整除的数叫做素数。
1.普通的素数筛:
简单地说,就是枚举从2到根号N的所有自然数,看它能否被整除,这也是素数的基本定义
for(int i=2;i*i<=j//也可以写作i<=sqrt(i);i++) { if(j%i==0) { flag=0; break; } } if(flag { printf("%d\n",j); } flag=1;
2.埃氏筛:
从2开始枚举,因为已知2是素数,所以2的所有倍数都不是素数,同理,3是素数,所以3的所有倍数都不是素数……
以此类推,大部分的数都可以作为1-10的倍数出现,所以埃氏筛是简单好用的筛法。
#define MAXN=1000000;
bool vis[maxn]; int prime[maxn],x; for(int i=2;i<=n;i++) { if(!vis[i]) prime[x++]=i;//储存素数 for(int j=2;j*i<=n;j++)//枚举该素数的倍数并筛去 { vis[i*j]=true; } }
这样,被标记false的都是素数(或者说prime里的都是素数)。
3.欧拉筛(线性筛):
我管他叫做埃氏筛2.0
简单来说,在埃氏筛的基础上,使每一个合数都只能被素数筛一次
#define MAXN=1000000;
bool vis[maxn]; int prime[maxn],x;
for(int i=2;i<=n;i++)
{
if(!vis[i]) prime[x++]=i;
for(int j=0;j<x;j++)
{
if(i*prime[j]>n) break;
vis[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}

浙公网安备 33010602011771号