原理:任何数的整数倍必定不是素数,大于二的偶数必定不是素数。
假设有一个筛子存放1~N,例如:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ....N
先将2的倍数筛去:
2 3 5 7 9 11 13 15 17 19 21....N
再将3的倍数筛去:
2 3 5 7 11 13 17 19....N
再来将5的倍数筛去,再来将7的质数筛去,再来将11的倍数筛去........,如此进行到最后留下的数就都是质数,这就是 Eratosthenes 筛选方法(Eratosthenes Sieve Method)。
void Erathosthenes()//筛选素数
{
int n=10000;
memset(vis,0,sizeof(vis));
for(int i=2; i<=n; i++)
if(!vis[i])
{
prime[num++]=i;
for(int j=i*i; j<=n; j+=i)
vis[j]=i;
}
}
【1】
#include<stdio.h>
#include<string.h>
int prime[20001];
void is_prime()
{
prime[0]=0;
prime[1]=0;
for(int i=2; i*i<=20000;i++)
{
if(prime[i])
{
int j=2*i;
while( j<=20000)
{
prime[j]=0;
j+=i;
}
}
}
}
int main()
{
memset(prime,-1,sizeof(prime));
is_prime();
for(int i=0;i<20001;i++)
{
if(prime[i])
printf("%d ",i);
if(i%1000==0)
putchar('\n');
}
return 0;
}
【2】
#include <iostream>
#include <cmath>
#define MAX 100
using namespace std;
int main()
{
int prime[MAX+1];
for(int i=1;i<=MAX;i++)
{
if(i%2==0)
{
prime[i]=0;
}
else prime[i]=1;
}
for(int i=3;i<=sqrt(MAX);i++)
{
if(prime[i]==1)
{
for(int j=i+i;j<=MAX;j=j+i)
{
prime[j]=0;
}
}
}
cout<<"2"<<" ";
for(int i=3;i<=MAX;i++)
{
if(prime[i]==1)
cout<<i<<" ";
}
return 0;
}