题解 P3912 【素数个数】
来一个短的代码
#include <iostream>//很简单的线性筛
#include <cstdio>
#include <cmath>
using namespace std;
bool val[100000001];//质数为0合数为1
int n,k;
int main(){
scanf("%d",&n);
int sum=0;//这里sum记录的是合数的个数
for(int i=2;i<=sqrt(n);i++)//筛到根号n即可
if(!val[i])//用质数筛
for(k=2;k*i<=n;sum+=val[i*k]?0:1,val[i*k++]=1);//将i的倍数筛去
printf("%d",n-sum-1);
return 0;
}