最简单的埃式筛法
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int i,j,a,b;
int prim[1111];
while(cin>>a>>b)
{
memset(prim,0,sizeof(prim));
for(i=2;i<=b;i++)
{
if(prim[i]==0)
{
for(j=i*2;j<=b;j+=i){
prim[j]=1;
}
}
}
for(i=a;i<=b;i++)
{
if(prim[i]==0){
cout<<i<<endl;
}
}
}
return 0;
}
欧拉筛法的优化
除了{2,3,5}为素数,其他的数可以写成6N,6N+1,6N+2,6N+3,6N+4,6N+5(N>=1),可以表示全部的数6N,6N+2,6N+4都为偶数,不是素数,6N+3 == 3(2N+1) 不是素数,那么就只筛6N+1和6N+5就可以了。
#include<iostream>
#include<cstring>
using namespace std;
int prim[11111]={2,3,5};
int main()
{
int i, j, flag, n;
int gcd = 2;
int k = 3;
while(cin>>n){
for(i=7;i<=n;i+=gcd)
{
gcd = 6-gcd;//6N+1和6N+5的变换。
flag = 1;
for(j=0;prim[j]*prim[j]<=i;j++)
if(i%prim[j] == 0){
flag = 0;
break;
}
if(flag)//说明是素数
prim[k++] = i;
}
for(i=0;i<k;i++)
cout<<prim[i]<<endl;
}
return 0;
}