您的位置:首页 > 其它

2016 4 16月赛B题

2016-04-17 16:37 567 查看


B:五位以内对称素数

总时间限制: 2000ms 内存限制: 3000kB描述
判断一个数是否为对称且不大于五位数的素数。

输入输入数据含有不多于50个的正整数(0输出对于每个n,如果该数是不大于五位数的对称素数,则输出“Yes”,否则输出“No”。每个判断结果单独列一行。样例输入
11 101 272

样例输出
Yes


Yes


No


这道题一点都不难,只是想说一点东西而已。

第一,你是选择打素数表做这题还是每次输入都去算?

第二,你是选择用数组存储字符串,这样方便比较对称性,还是用数字呢?

我自己的想法就是,如果你打表的话,那你要从2一直到100000去一直枚举,得到素数,存入一个数组里面,你这样每个数都要去算一次,还不如直接放弃打表,在每次读入那个数判断呢。第二,这道题是最多是五位数字的数,也就是最大是99999,这样一个数并不复杂,不需要用字符串,直接用整数读取,然后用对十取余,除以十,存入一个数组,重复,来比较。否则用字符串还要把这个数重新计算出来

这道题,有个地方是我自己的想法一直转不过来,一开始很疑惑不大于五位数的整数,是指不大于最小的五位数10000还是不大于五位的数呢?这导致我在判断这个数的时候纠结很久,然后混乱了,找了很久bug才找出来原来是错在这里了。

代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
int a,t[1000];
int i,mid,sw,temp,top;
while(scanf("%d",&a) != EOF)
{
sw = 1;

temp = a;

for(i = 0; temp > 0; i++)
{
t[i] = temp % 10;
temp /= 10;
}

top = i;

if(top > 5) //对,就是这里,我一开始用的是大于等于5,我这代码写的这么简洁却败在这里
sw = 0;

for(i = 0; i < top / 2 && sw; i++)//如果上面的情况都不符合了,下面就不用判断了,所以这里有一个sw
{
if(t[i] != t[top - 1 - i])
{
sw = 0;
break;
}
}

if(sw)
{
mid = sqrt(a);
if(a != 1)
for(i = 2; i <= mid; i++)
{
if(a % i == 0)
{
sw = 0;
break;
}
}
else
sw = 0;
}
if(sw)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: