1:普通筛法
筛去所有素数的倍数。
代码:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
#define maxn 1000003
int vis[maxn];
int prime[maxn];
void prime1()//求出所有素数
{
prime[1]=1;
prime[0]=1;
for(int i=2;i<=sqrt(maxn);i++)
{
if(!prime[i])
for(int j=i*2;j<=maxn;j+=i)
{
prime[j]=1;//筛去i的倍数,最后将所有数的倍数 筛去。
}
}
}
int main()
{
ll t,n;
memset(prime,0,sizeof(prime));
prime1();
for(int i=0;i<=100;i++)
{
if(!prime[i])
{
cout<<i<<endl;
}
}
}
2:欧拉筛法
欧拉筛法与上面的方法比较,它筛的倍数,而且,避免了重复筛除。
代码:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
#define maxn 1000003
int vis[maxn];
int ans[maxn];
int prime[maxn];
void prime1()//求出所有素数
{
prime[1]=1;
prime[0]=1;
int t=0;
for(int i=2;i<=maxn;i++)
{
if(!prime[i])
ans[t++]=i;
for(int j=0;j<t&&ans[j]*i<=maxn;j++)
{
prime[i*ans[j]]=1;//素数的prime[]的值是0
if(i%ans[j]==0)//这两句话的意思是,如果i%ans[j]==0,又因为i=ans[j]*?,则i*ans[j+1]=ans[j]*?*ans[j+1],那么
//ans[j+1]一定能被另一个数筛去,就不必重复,越往后数越多,会浪费时间
break;
}
}
}
int main()
{
ll t,n;
memset(prime,0,sizeof(prime));
prime1();
for(int i=0;i<100;i++)
cout<<ans[i]<<endl;
}
第一种,输出的是100以内的素数
第二种输出的是前100个素数