埃氏筛法:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
bool st[N];
int n,cnt=0;
void qiuz(){
if(n==1){
cout<<"0";
return ;
}
for(int i=2;i<=n;i++){
if(!st[i]){
cnt++;
for(int j=i+i;j<=n;j=j+i){
st[j]=true;
}
}
}
cout<<cnt;
return ;
}
int main(){
cin>>n;
qiuz();
return 0;
}
线性筛法:每个合数只会被他的最小质因子筛掉。
#include<bits/stdc++.h>
using namespace std;
const int N=1000100;
int cnt=0,prime[N];
bool st[N];
void f(int x){
for(int i=2;i<=x;i++){
if(!st[i]){
prime[cnt++]=i;
}
for(int j=0;prime[j]*i<=x;j++){//不用加j<cnt,如果i是质数,遍历到cnt-1就会结束,如果i是合数,那么一定有最小质因子,一定会在cnt-1前结束。
st[prime[j]*i]=true;
if(i%prime[j]==0){//保证合数一定是被最小质因数筛掉的。因为一个合数只有一个最小质因子,所以每个合数只会被筛掉一次
break;
}
}
}
}
int main(){
int n;
cin>>n;
f(n);
cout<<cnt;
return 0;
}