#include<bits/stdc++.h>
using namespace std;
const int N=1e8+5;
const int maxx=1e6;
#define inf 0x3f3f3f3f
int prime[maxx];//用来储存素数
bool vis[N];//true表示访问过,false表示没有访问过
//欧拉筛筛选素数(进行大范围的素数判断)
//欧拉筛其实是埃拉托斯特尼筛法的一种优化
int main(){
int n,cnt=0;
cin>>n;
memset(prime,0,sizeof(prime));//进行数组的初始化
memset(vis,false,sizeof(vis));
vis[1]=true;
for(int i=2;i<=n;i++){
if(!vis[i]){//当这个数未被访问过时,标记上并且用prime数组存下素数
vis[i]=true;
prime[++cnt]=i;
}
//进行欧拉筛选的核心操作
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
vis[prime[j]*i]=true;
if(i%prime[j]==0){
break;//防止重复标记同一个数的现象出现
}
}
}
cout<<cnt;
return 0;
}
欧拉筛(筛选素数)
于 2022-03-01 21:59:03 首次发布