題目:給定數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;
}