质数数量
改题目需要注意的是时间
如果进行多次判断就会超时,这时需要使用素数筛结合标志数组进行对所有数据范围内进行判断,而后再结合前缀和将结果存储到数组中,就可以在O(1)的时间复杂度求出素数个数。
#include<iostream>
using namespace std;
const int N=1000000+10 ,M=1000;
int t,n;
int a[N];
int main()
{
//此时a[i]作为标志数组,判断是否为素数
for(int i=2;i<=M;i++)//判断素数范围,一般是根号N
{
if(a[i]==0)//没有访问过,即是素数
{
for(int j=i*i;j<N;j+=i)
a[j]=1;//将所有i的倍数都不是素数
}
}
for(int i=2;i<N;i++)
{
if(a[i]==0)//第a[i]个素数的前缀和,此时a[i]存放小于等于i的素数个数
a[i]=a[i-1]+1;
else
a[i]=a[i-1];
}
cin>>t;
while(t--)
{
cin>>n;
cout<<a[n]<<endl;
}
return 0;
}