给定一个正整数 n,请你求出 1∼n 中质数的个数。
输入格式
共一行,包含整数 n。
输出格式
共一行,包含一个整数,表示 1∼n中质数的个数。
数据范围
1≤n≤10^6
输入样例:
8
输出样例:
4
线性筛法:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e6+10;
int n,cnt;
int primes[N];
bool st[N]; //判断质数所用
void get_primes(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[cnt++] = i; //prime存质数。
for(int j=0;primes[j]<=n/i;j++)
{
st[primes[j] * i]=true; //以每个合数的最小质因子筛掉这个合数
if(i % primes[j] == 0 ) break; //表面prime[j]一定是i的最小质因子
}
}
}
int main()
{
scanf("%d",&n);
get_primes(n);
printf("%d",cnt);
return 0;
}
埃氏筛法:
#include<iostream>
using namespace std;
const int N=1e6+10;
int n,cnt;
int primes[N];
bool st[N];
void get_primes(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[cnt++] = i;
for(int j=i+i;j<=n;j+=i) st[j]=true; //把质数的倍数删掉
}
}
int main()
{
scanf("%d",&n);
get_primes(n);
printf("%d",cnt);
return 0;
}