题目链接
题目意思:
给出一个正整数n,求不大于n的所有素数个数。
思路:
素数筛+二分
主要是再熟悉一下素数筛和stl里的二分
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=1e5+5;
int num[MAXN],cnt;//num[i]表示第i个素数是什么
bool isprime[MAXN];
void prime()
{
cnt=1;
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1]=0;//1 0特判
for(int i=2;i<=MAXN;i++)
{
if(isprime[i])num[cnt++]=i;
for(int j=1;j<=cnt&&i*num[j]<=MAXN;j++)
{
isprime[i*num[j]]=0;
if(i%num[j]==0)break;
}
}
}
int main()
{
int n,pos;
prime();
while(~scanf("%d",&n))
{
pos=upper_bound(num,num+cnt,n)-num;//找到num里第一个大于n的位置
printf("%d
",pos-1);
}
return 0;
}