您的位置:首页 > 其它

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

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

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循环 求素数的话,一定是会超时的。所以在想的奶疼的时候聪明机智的我就去百度了一下大神的博客,大神的博客讲解了如何快速求素数,详细的在外面自己去看。

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

void prime()
{
for(i=2,w=0;i<1000100;i++)
{
int q;
q=0;
if(i==2||i==3)
{
a[w++]=i*i;
continue;
}
if(i%6!=1&&i%6!=5)
{
continue;
}
for(j=5;j*j<=i;j=j+6)
{
if(i%j==0||i%(j+2)==0)
{
q=1;
break;;
}
}
if(q==1)
continue;
a[w++]=i*i;
}
}


原先写的时候是没有写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;
}
}
}


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

确实还是大神比较厉害一点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: