1. 程式人生 > >素數篩選法杭電2136

素數篩選法杭電2136

#include
#include
using namespace std;
#define maxn 1000000
int a[maxn];
int main()
{
int n;
int k=1;
for(int i=2;i<=maxn;i++)
{
if(a[i]==0)
{
a[i]=k++;//標記每個素數的位置
for(int j=2*i;j<=maxn;j=j+i)//把每個倍數的數都標記說明這個數不是素數
{
a[j]=a[i];
}
}
}
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",a[n]);
}
}

打表法輸出素數

#include
#include
using namespace std;
#define maxn 1000
int a[maxn],pri[maxn];
int main()
{
int cnt=0;
int n;
cin>>n;
for(int i=2;i<=n;i++)
{
if(!a[i])
{
pri[cnt++]=i;
}
for(int j=2*i;j<=n;j=j+i)
{
a[j]=0;
}
}
for(int i=0;i<cnt;i++)
cout<<pri[i]<<" ";

}

不能用普通的輸入一個數在判斷,直接打表這樣效率高,從2開始標記,開始的時候把2標記成素數的第一個位置,把2的倍數全都標記一遍,因為這些數字都不是素數,在把下一個素數標記為第二個位置,再把3的倍數全都標記一遍,以此類推

https://blog.csdn.net/gtuif/article/details/73732070提供了打表法