这一题很多人的问题可能会在于时间,用传统的循环做,时间复杂度会很大,对于每一个给定的数字,都要从2~n去遍历,实际上会有很多重复操作,与其这样,不如一开始就将1000000之内的质数找出来,保存到一个数组中,这样对于每一个给定的数字,就可以直接输出他的质数和。

#include<stdio.h>
#include<math.h>//包含sqrt平方函数;
int main ()
{
    int T,n=0,i,flag,j;
    int number[1000001]={0};//定义一个数组来储存
    for( j=2;j<1000001;j++){
        flag=1;//一个标识
        for(i=2;i<=(int)sqrt(j);i++)//判读一个数是否为质数,只需要判读2~sqrt(n)内是否有能整除的数
        {
            if(j%i==0)
            {
                flag=0;
                break;
            }
        }
        if(flag==1)//当flag==1;说明没有进入到if判断中,这个数为质数
        {
            n++;当前数内有多少个质数
        }
        number[j]=n; 将n保存到数组中,为j所对应的质数的多少;
    }
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        printf("%d\n",number[n]);
    }
    return 0;
}