朴素判断
时间复杂度O(n2)
#include<bits/stdc++.h>
using namespace std;
const int N=1e3;
bitset<N> prime;
bool judge(int x){
for(int i=2;i<=x/i;i++){
if(x%i==0) return false;
}
return true;
}
int main()
{
int n=N;
int cnt=0;
for(int i=2;i<=n;i++){
if(judge(i)) cnt++;
}
cout<<cnt<<endl;
return 0;
}
埃氏筛法
时间复杂度为O(nlog(logn))
#include<bits/stdc++.h>
using namespace std;
const int N=1e8;
bitset<N> prime;
int main()
{
int b=1e7;
prime[0]=1;
prime[1]=1;
int cnt=0;
for(int i=2;i<=b/i;i++){
if(!prime[i]){
for(int j=i*i;j<=b;j+=i){
prime[j]=1;
}
}
}
for(int i=2;i<=b;i++)
if(!prime[i]) cnt++;
cout<<cnt<<endl;
return 0;
}
欧拉筛法
时间复杂度为O(n)
这里欧拉筛法的优点是在计算过程中就把所有素数存在一个数组里了,速度也更快,但是占用的空间会更大。
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
bitset<N> prime;
int prime_s[N],p=0;
int main()
{
int cnt=0;
for(int i=2;i<=N;i++){
if(!prime[i]){
prime_s[++p]=i;
cnt++;
}
for(int j=1;j<=p&&i*prime_s[j]<=N;j++){
prime[prime_s[j]*i]=1;
if(i%prime_s[j]==0) break;
}
}
cout<<cnt<<endl;
return 0;
}
|