题目
给定一个正整数 n,请你求出 1∼n 中质数的个数。
输入格式
共一行,包含整数 n。
输出格式
共一行,包含一个整数,表示 1∼n 中质数的个数。
数据范围
1≤n≤106
输入样例:
8
输出样例:
4
代码
埃式筛法
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int cnt;
bool st[N];
int prime[N];
void get_prime(int n)
{
for(int i = 2; i <= n; i ++)
{
if(!st[i])
{
prime[cnt ++] = i;
for(int j = i + i; j <= n; j += i)st[j] = true;
}
}
}
int main()
{
int n;
cin >> n;
get_prime(n);
cout << cnt;
return 0;
}
线性筛法
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int cnt;
bool st[N];
int prime[N];
void get_prime(int n)
{
for(int i = 2; i <= n; i ++)
{
if(!st[i]) prime[cnt ++] = i;
for(int j = 0; prime[j] <= n / i; j ++)//枚举所有质数
{
st[prime[j] * i] = true;
if(i % prime[j] == 0) break;//prime[j] 一定是i的最小质因数
}
}
}
int main()
{
int n;
cin >> n;
get_prime(n);
cout << cnt;
return 0;
}