————————————————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; } } }
这是我写代码虽然空间复杂度低了一点点,但是时间复杂度却飙升。么么。
确实还是大神比较厉害一点。