学习笔记——素数筛法

素数的定义:除了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;
   }
}

 

 

posted @ 2022-03-24 19:12  美索maysoul  阅读(72)  评论(6)    收藏  举报