AcWing 868. 筛质数
原题链接
简单
#include <iostream>
using namespace std;
const int N = 1000010;
int primes[N];
int j = 0;
bool st[N]; // true -> 不是质数,false -> 是质数
int n;
void get_primes_erato(int a)
{
for (int i = 2; i <= a; i++)
{
if (st[i])
{
continue;
}
j++;
for (int j = 2; i * j <= a; j++)
{
st[j * i] = true;
}
}
}
void get_primes_linear(int a)
{
for (int i = 2; i <= n; i++)
{
// 没被筛的数,都是质数
// 保证每个合数都被其最小的质数筛掉,且只被筛一次
if (!st[i])
primes[j++] = i;
// 为什么不判定 k < j ?
// 1. 如果i是合数,必然会被某个质数整除,会跳出循环
// 2. 如果i是质数,primes最后一个元素就是i,也会跳出循环
for (int k = 0; primes[k] <= a / i; k++)
{
st[primes[k] * i] = true;
if (i % primes[k] == 0) // 如果不退出,prime[k+1] * i 的最小质数应该是primes[k],不满足需求
break;
}
}
}
int main()
{
scanf("%d", &n);
get_primes_linear(n);
printf("%d\n", j);
return 0;
}