题目链接
百度埃式筛法链接
埃式筛法
1,求2~sqrt(n)内素数 //输出,储存
2,sqrt(n)+1~n,划掉2的倍数 //2是上一步存下来的
2~sqrt(n)内的素数;
3,这一轮划数后,剩下一堆数,最后一个数如果小于2~sqrt(n)内素数
的最后一个数,跳出循环
4,类似于2,3,步,依次划掉3的倍数,5的倍数…直到循环结束
#include<bits/stdc++.h>
using namespace std;
bool prime(int n)
{
if(n==2)return true;
for(int i=2;i<n;i++)
{
if(n%i==0)return false;
}
return true;
}
int main()
{
int n,j=0,t=0;
cin>>n;
if(n==1||n==0)return 0;
int p[n];
vector<bool>isprime(n+1,true);
for(int i=2;i<=sqrt(n);i++)
if(prime(i))
{
printf("%d\n",i);
p[j++]=i;
}
bool flag=false;
for(int i=0;i<j;i++)
{
for(int k=sqrt(n)+1;k<=n;k++)
{
if(k%p[i]==0)
{
isprime[k]=false;
continue;
}
else
{
if(isprime[k]&&k>=t)
t=k;
if(p[i]*p[i]>t)
{
flag=true;
break;
}
}
}
if(flag)break;
}
for(int k=sqrt(n)+1;k<=n;k++)
{
if(isprime[k])printf("%d\n",k);
}
}