这题需要用埃氏筛或者线性筛才能做出来
但作者太菜了只能用埃氏筛
素数的倍数一定是合数,所以我们将其中一个数的倍数都去掉,再选一个数,再去掉
#include<bits/stdc++.h>
using namespace std;
int n;
int sum;
bool flag[100000001];//用来看有没有被选中,因为在函数外所以都是false
void isprime(int x) {//埃氏筛
for (int i = 2; i <= x; i++) {//每一个数都看看
if (flag[i]) continue;//如果为真,跳过循环进入下一轮
for (int j = 2; j * i <= n; j++)flag[j * i] = true;//倍数去掉
}
for (int i = 2; i <= x; i++) {
if (flag[i]) continue;
sum++;//加上
}
return;
}
int main() {//如果这你都看不懂就别做普及-
scanf("%d", &n);
isprime(n);
printf("%d", sum);
return 0;
}