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;
}
相关文章推荐
- 手机总流量统计
- Little-Endian or Bigger-Endian?
- Python 集合(set)类型的操作
- Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面
- PHP实现当前文件夹下所有文件和文件夹的遍历
- [HDOJ1171]Big Event in HDU(01背包)
- zoj 3903 Ant【推公式+逆元】
- javascript中textContent与innerText的异同分析
- 自定义多状态高仿应用下载百分数view
- web基础
- Android音频开发(6):使用 OpenSL ES API(上)
- 第五种项目四-长方柱类
- 水电费
- new、delete、malloc、free
- microsoft project 添加空行 空白行 空白任务
- Activity生命周期
- spring基础知识详解
- Windows Eclipse 调试 HBase
- POJ 3069Saruman's Army
- Android之Wifi开发