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;
}