题目描述
求 1,2,⋯,N 中素数的个数。
输入格式
一行一个整数 N。
输出格式
一行一个整数,表示素数的个数。
样例 #1
样例输入 #1
10
样例输出 #1
4
提示
对于 100% 的数据,1≤1081≤N≤108。
本题时间限制在2秒以内。
因为题目时间限制是2秒,所以可以用埃式筛法
埃式筛法
埃式筛法的原理很简单
如果 i 是质数,那么把所有的小于 n 的 i 的倍数(不包括 i )标记 vis[j]=1;
#include <bits/stdc++.h>
using namespace std;
bool vis[100000010]; //标记数组
int n,ans=0;
int main(){
scanf("%d",&n);
vis[0]=vis[1]=1;
for(int i=2;i*i<=n;i++){ //优化1
if(vis[i]!=1){
for(int j=i*i;j<=n;j+=i){ //优化2
vis[j]=1; //0是质数,1不是
}
}
}
for(int i=2;i<=n;i++){
if(vis[i]==0){
ans++;
}
}
printf("%d",ans);
return 0;
}