素数筛法
1.埃式筛
#include <iostream>
#include<stdio.h>
#include<algorithm>
#define me(a,b) memset(a,b,sizeof(a))
const int maxn=1e6+10;
using namespace std;
int a[maxn],b[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
me(a,0);//先假设所有的数都是素数
me(b,0);
int l=0;
for(int i=2;i<=n;i++)
{
if(!a[i])//是素数
{
b[l++]=i;//记录素数
a[i]=1;//标记已经记录过的点
for(int j=i*2;j<=n;j=j+i)
{
a[j]=1;//标记不是素数的点
}
}
}
for(int i=0;i<l;i++)
printf("%d ",b[i]);
printf("\n");
}
return 0;
}
2.欧拉筛
#include <iostream>
#include<stdio.h>
#include<algorithm>
#define me(a,b) memset(a,b,sizeof(a))
const int maxn=5e6+10;
using namespace std;
int a[maxn],b[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
me(a,0);
me(b,0);
int l=0;
for(int i=2;i<=n;i++)
{
if(!a[i])//是素数
{
a[i]=i;//标记访问过的数
b[l++]=i;//记录素数
}
for(int j=0;j<l&&b[j]*i<=n;j++)
{
a[b[j]*i]=b[j];//标记不是素数的数
if(i%b[j]==0)//这个点已经被标记过了
break;
}
}
for(int i=0;i<l;i++)
printf("%d ",b[i]);
printf("\n");
}
return 0;
}