简单易懂欧拉筛

复杂度

n

分析

其实就是把埃筛的改进罢了,避免重复
具体看代码

代码

#include<bits/stdc++.h>
using namespace std;
bool vis[10000000];
int prime[10000];
int Oulashai(int n){
	memset(vis,0,sizeof(vis));
	int cnt=0;
	for(int i=2;i<=n;i++){
		if(!vis[i]) prime[cnt++]=i;
		for(int j=0;j<cnt&&i*prime[j]<=n;j++){
			vis[i*prime[j]]=true;
			if(i%prime[j]==0) break;
			//这个地方关键因为 
			//i%prime[j]==0,可以把i看做prime[j]*x,那么(k>i)i*prime[k]==prime[j]*x*prime[k];
			//又可以把 x*prime[k]另一个数,那么将来的某次循环会把i*prime[k]==prime[j]*x*prime[k]
			//给筛了,从而避免了重复 
		}
	}
	return cnt;
} 
int main(){
	int n,i; 
	while(cin>>n){
		for(i=0;i<Oulashai(n);i++)
		{
			cout<<prime[i]<<' ';
		if(i%10==0) cout<<endl;
		}
	}
	return 0;
}
posted @ 2018-12-07 16:10  ChunhaoMo  阅读(250)  评论(0编辑  收藏  举报