素數篩(埃氏篩 尤拉篩)
阿新 • • 發佈:2021-02-06
埃氏篩
#include<bits/stdc++.h>
using namespace std;
int check[1000001];
int pri[1000001];
int main()
{
int cnt=0;
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
if(!check[i])
pri[++cnt]=i;
for(int j=2;j*i<=n;j++)
check[j*i]=1;
}
for(int i=1;i<=cnt;i++ )
printf("%d\n",pri[i]);
return 0;
}
埃氏篩的缺陷,對於一個合數可能多次被篩除,增加了時間複雜度
而尤拉篩改進了這個地方,在埃氏篩的基礎上,使每個合數只被最小質因子篩選一次,達到不重複目的。時間複雜度為O(n)
尤拉篩
#include<bits/stdc++.h>
using namespace std;
int check[1000001];
int pri[100001];
int cnt;
void euler(int n)
{
for(int i=2;i<=n;i++)
{
if(!check[i])
pri[ ++cnt]=i;
for(int j=1;pri[j]*i<=n;j++)
{
check[pri[j]*i]=1;
if(i%pri[j]==0)
break;
}
}
}
int main()
{
int n;
scanf("%d",&n);
euler(n);
for(int i=1;i<=cnt;i++)
printf("%d\n",pri[i]);
return 0;
}