1. 程式人生 > 其它 >素數篩(埃氏篩 尤拉篩)

素數篩(埃氏篩 尤拉篩)

技術標籤:初等數論演算法c++

埃氏篩

#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; }