核心: n只会被其最小质因子筛掉
每一个合数都只会被筛一次,因为每个合数的最小质因数都是唯一的
#include<iostream>
#include <algorithm>
using namespace std;
const int N = 1000010;
int prime[N],cnt;
bool st[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; //将prime[j]的倍数筛掉
if(i % prime[j] == 0) break; //如果i % prime[j] == 0 说明i是prime[j]的倍数
//那么当prime[j+1]的时候 prime[j+1]*i的最小质因数是prime[j] 而不是prime[j+1]
}
}
}
int main()
{
int n;
cin>>n;
get_prime(n);
cout<<cnt;
}