#include
using namespace std;
const int maxn = 1e6 + 5;
bool a[maxn];
int b[maxn];
int T,n;
int main()
{
for(int i = 0;i < maxn;i++)
a[i] = 1;//先假定所有数都为质数
a[0] = a[1] = 0;//零和一都不是质数
for(int i = 2;i < maxn;i++)
if(a[i] == 1)//如果是质数,开始判断
for(int j = 2*i;j <= maxn;j += i)//只要是**数的倍数,它就是质数
a[j] = 0;//所以变为0,代表它不是质数
for(int i = 2;i < maxn;i++)
if(a[i] == 1)//如果它是质数
b[i] = b[i-1] + 1;//让包括它在内的之前的所有质数个数累加
else //如果它不是质数
b[i] = b[i-1];//不累加,并且继承之前的个数
cin >> T;
while(T--)
{
cin >> n;
cout << b[n] << endl;//输出在n之前的所有的质数个数
}
return 0;
}
原理如下:
根据质数的定义,可以得出:任意数的倍数都不是质数。
一开始假定所有数都为质数,从2计算倍数,只要是2的倍数,都不是质数,所以将以2倍数为下标的bool类型改为0(非0即真0即 假),以此类推3,5,7,9......