#include<bits/stdc++.h>
using namespace std;
const int N=100000001;
int prime[N];
bool a[N];
int n,ans,cnt;
int main(){
cin>>n;
for(int i=2;i<=n;i++){
if(!a[i])cnt++,prime[cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=n;j++){
a[i*prime[j]]=1;
if(i%prime[j]==0)break;//这个就是关键,因为避免了对合数的重复赋值为1
}
}
for(int i=2;i<=n;i++)if(!a[i])ans++;
cout<<ans;
}
上面的这个是欧拉筛法
下面的这个是埃氏筛法
#include<bits/stdc++.h>
using namespace std;
long long n,ans;
int a[10000010];
int main(){
cin>>n;
for(int i=2;i<=n;i++){
if(!a[i]){
for(int j=2*i;j<=n;j+=i){
a[j]=1;
}
}
if(!a[i]){
ans++;
}
}
cout<<ans;
}