nitoj 127 假签到 素数筛+二分

题目链接
题目意思:
给出一个正整数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;
}

原文地址:https://www.cnblogs.com/gugudesu/p/11185987.html