#include <iostream>
using namespace std;
const int N = 1000010;
int prime[N];
bool st[N];
int n;
int get_prime(int &n)
{
int cnt = 0;
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;
//pj是从小到大枚举的质数,!=0时pj小于i的最小质因子
//==0时,pj一定是i的最小质因子,
//pj一定是pj*i的最小质因子
//break掉,退出循环,pj*i能被最小质因子改为true(即筛出掉)
//合数,质数均且只存在唯一的最小质因子 ,
//每一个数都用最小质因子来筛出,
//每个数只会被筛一次 , 所以是线性的
}
}
return cnt;
}
int main()
{
cin >> n;
cout << get_prime(n) << endl;
return 0;
}
线性筛选——筛质数(内含注释)
最新推荐文章于 2024-10-09 22:28:58 发布