素數篩選

題目:給定數n輸出裏面素數的個數。

 tip:三種做法

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=1e8;
vector<int> prime(maxn,0);
vector<int>ans;
int cnt=0;
void isprime0(int n) {//O(n*sqrt(n))
	for(int i=2; i<=n; ++i) {
		for(int j=2; i!=2&& j<=sqrt(i)+1; ++j)
			if(i%j==0)//定義法 
			{
				prime[i]=1;
				break;
			}
		if(!prime[i])
			ans.push_back(i);
	}
}
void isprime1(int n) {//埃氏篩選法 O(nlog(n))
	for(int i=2; i<=n; ++i)
		if(!prime[i]) {
			ans.push_back(i);
			for(int j=2*i; j<=n; j+=i)
				prime[j]=1;
		}
}
void isprime2(int n) {//O(n)
	for(int i=2; i<=n; ++i) {
		if(!prime[i]) {
			ans.push_back(i);
			cnt++;
		}
		for(int j=0; j<cnt&&i*ans[j]<=n; ++j) {//用到了所有合數都可以表示成素數之積
			prime[i*ans[j]]=1;
			if(i%ans[j]==0)
				break;
		}
	}
}
int main() {
	int n;
	cin>>n;
	isprime0(n);
	cout<<ans.size()<<endl;
//	for(int i=0; i<ans.size(); ++i)
//		cout<<ans[i]<<" ";
	return  0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章