题目描述
质数(prime number)又称素数,有无限个,质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
例如小于10的质数有2,3,5,7。
输入描述:
第一行输入一个整数T,表示询问的个数 接下来T行每行输入一个整数n. 1<=T<=1e8,1<=n<=1000000
输出描述:
对于每个询问n输出小于等于n的的质数的个数。
示例1
输入
2 10 1000000
输出
4 78498
代码如下:
#include<iostream>
using namespace std;
int t, n, cnt;
const int N = 1e6 + 10;
bool isprime[N];
int prime[N];
int a[N];
void isPrime() {
for(int i = 2; i <= N; i ++) {
if(!isprime[i]) {
prime[cnt ++] = i;
a[i] = cnt; // 将a[2] = 1, a[3] = 2, a[5] = 3 ....存起来
}
for(int j = 0; prime[j] <= N / i; j ++) {
isprime[prime[j] * i] = true;
if(i % prime[j] == 0) break;
}
}
for(int i = 2; i <= N; i ++) {
// a[4] = 0, a[6] = 0...a[i] = 0等不是质数的,把它们范围内的质数数量进行处理
if(a[i] == 0) a[i] = a[i - 1];
}
}
int main() {
scanf("%d", &t);
isPrime();
for(int i = 0; i < t; i ++) {
scanf("%d", &n);
printf("%d\n", a[n]);
}
return 0;
}