题目描述
求 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;
}
该程序通过埃式筛法优化计算,在不超过2秒的时间限制内找出1到N之间所有素数的个数。首先初始化标记数组,然后遍历从2开始的所有数,标记其倍数为非素数,最后统计未被标记的数(即素数)的数量。
569

被折叠的 条评论
为什么被折叠?



