重庆网站制作外包cpa推广联盟平台
质数数量
改题目需要注意的是时间
如果进行多次判断就会超时,这时需要使用素数筛结合标志数组进行对所有数据范围内进行判断,而后再结合前缀和将结果存储到数组中,就可以在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;elsea[i]=a[i-1];}cin>>t;while(t--){cin>>n;cout<<a[n]<<endl;}return 0;}