C++ 代码
/**
* 埃氏筛法:通过筛掉质数的倍数来筛掉合数
*/
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
bool st[N]; // true代表被筛掉的合数,false代表没被之前的数筛掉,意味着是质数
int n;
int get_primes(int n) {
int cnt = 0;
for (int i = 2; i <= n; i++) {
if (!st[i]) { // 只筛质数的倍数,因为合数及其倍数已经被它质因子筛掉了
cnt++;
for (int j = 2; j <= n / i; j++) st[j * i] = true;
}
}
return cnt;
}
int main() {
cin >> n;
cout << get_primes(n);
return 0;
}