这个问题可以通过使用埃拉托斯特尼筛法(Sieve of Eratosthenes)来解决。这是一种用来找出一定范围内所有素数的方法。我们首先创建一个布尔数组,将所有的数标记为素数(true)。然后,从2开始,将所有2的倍数标记为非素数(false)。接着,找到下一个标记为素数的数,将它的所有倍数标记为非素数。重复这个过程,直到没有更多的数可以标记。
以下是解决这个问题的C++代码:
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100001;
vector<bool> isPrime(MAXN, true);
vector<int> primeCount(MAXN, 0);
void sieve() {
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i < MAXN; ++i) {
if (isPrime[i]) {
for (int j = i * i; j < MAXN; j += i) {
isPrime[j] = false;
}
}
}
for (int i = 2; i < MAXN; ++i) {
primeCount[i] = primeCount[i - 1] + isPrime[i];
}
}
int main() {
sieve();
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
cout << primeCount[n] << endl;
}
return 0;
}
这段代码首先创建一个布尔数组`isPrime`和一个整数数组`primeCount`,然后调用`sieve`函数来标记素数并计算每个数以下的素数个数。然后,它读取测试数据的数量,对于每个测试数据,它读取一个整数n,然后输出1到n之间的素数个数。