————————————————1004——————

      ——————内心的激动无以复加————————————尼玛终于对了。先反省一下。。程序终于写出来了,当时比赛的时候没有写这个应该是时间不够,而且就算时间够用的话,也会因为时间复杂度过高,而超时。所以究其根本原因还是因为  你会得太少  你不知道应该怎样去快速排序而导致了,那一道   游乐场超时,你不会快速求素数而导致质方数超时。   小伙子  还是缺少锻炼,应该多练练,多学一点这种必须知道的东西,还有最近把这几道题弄完之后就开始看书吧。学习一下解题的思想。嗯嗯。不多臭屁了。现在把这一道题写一下。

Problem Description
  小明天生对数字比较敏感,3岁的时候就能背诵圆周率一百位。

  现在,小明慢慢长大了,但依然很喜欢数字,最近,他迷上了质数和平方数,并且自己把质数的平方命名为“质方数”。
  现在,他在研究这样一个问题:距离一个正整数N最接近的质方数是多少?
 

Input
输入数据第一行是一个正整数T(T<=20),表示有T组输入数据。
接下来T行,每行输入一个正整数N(1<=N<=10^8)。
 

Output
对于每组数据,请输出距离N最接近的质方数,每组输出占一行。
 

Sample Input
2
1
10
 

Sample Output
4
9
 

本题如果用两个for循环  求素数的话,一定是会超时的。所以在想的奶疼的时候聪明机智的我就去百度了一下大神的博客,大神的博客讲解了如何快速求素数,详细的在外面自己去看。

然后在将大神的判断素数改成数组储存素数的时出了问题

 1 void prime()
 2 {
 3     for(i=2,w=0;i<1000100;i++)
 4     {
 5         int q;
 6         q=0;
 7         if(i==2||i==3)
 8         {
 9             a[w++]=i*i;
10             continue;
11         }
12         if(i%6!=1&&i%6!=5)
13         {
14             continue;
15         }
16         for(j=5;j*j<=i;j=j+6)
17         {
18             if(i%j==0||i%(j+2)==0)
19             {
20                 q=1;
21                 break;;
22             }
23         }
24         if(q==1)
25             continue;
26         a[w++]=i*i;
27     }
28 }

原先写的时候是没有写20 24 25 26这几行代码的,所以出了错误。在进入到循环之后break跳出了循环然而还是把不是素数的数字当成了素数。

现在去检验一下    两个for循环写出来的,求素数快,还是大神写的快速求素数的办法快。

void prime()
{
    for(i=2,w=0;i<1000100;i++)
    {
        for(j=2;j<=i;j++)
        {
            if(i%j==0)
                a[w++]=i;
        }
    }
}

这是我写代码虽然空间复杂度低了一点点,但是时间复杂度却飙升。么么。

确实还是大神比较厉害一点。

原文地址:https://www.cnblogs.com/A-FM/p/5008350.html