一亿以内的回文素数
2015-08-30 21:29
183 查看
题意分析:求给定区间内的质数回文数
题目分析:
1.多组测试数据,所以先打表。
2.先求质数再判断回文,效率低下;所以先构造回文数,再判断质数。
3.偶数位的回文数都能被11整除,自己证明去。所以,偶数位的回文数除了11都是合数。
4.一个k位数,可以构造出一个奇数位的回文数。比如13,可以构造131;189可以构造18981.所以100000000内的只要从1构造到9999即可。
5.若范围为1000000000,那么明显超出int范围,要用long long。当然此题无此陷阱。
6. 最后按从小到大的顺序输出,优先队列搞定。
题目分析:
1.多组测试数据,所以先打表。
2.先求质数再判断回文,效率低下;所以先构造回文数,再判断质数。
3.偶数位的回文数都能被11整除,自己证明去。所以,偶数位的回文数除了11都是合数。
4.一个k位数,可以构造出一个奇数位的回文数。比如13,可以构造131;189可以构造18981.所以100000000内的只要从1构造到9999即可。
5.若范围为1000000000,那么明显超出int范围,要用long long。当然此题无此陷阱。
6. 最后按从小到大的顺序输出,优先队列搞定。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #include <cmath> #include <vector> #define MAXN 10000 #define RST(N)memset(N, 0, sizeof(N)) using namespace std; typedef long long LL; struct cmp { bool operator()(const int &a, const int &b) { return a > b; } }; priority_queue <int, vector<int>, cmp> pq; bool is_prime(int x) { for(int i=2; i<sqrt(x+0.5); i++) { if(x % i == 0) return false; } return true; } int main() { //freopen("data.in", "r", stdin); //freopen("data.out", "w", stdout); while(!pq.empty()) pq.pop(); pq.push(11); int sum, tmp; for(int i=2; i<MAXN; i++) { for(sum=i, tmp=i/10; tmp!=0; tmp/=10) { sum = sum*10 + tmp%10; } if(is_prime(sum)) pq.push(sum); } while(!pq.empty()) { cout << pq.top() << endl; pq.pop(); } return 0; }
相关文章推荐
- 两行文字,第二行超出部分不显示
- java中static变量和方法的总结
- 树莓派安装中文字库和输入方法
- getScrollX()的理解
- 浅谈操作系统对内存的管理
- 源泉书签今日更新:在用户注册后,会显示首页的超链接,操作更加人性化
- remove ele when iterative hashmap
- STL之双向链表及其迭代器简单实现
- 二分查找的两种写法
- CSS选择器的特殊性和LOVE HA
- poj1125floyd
- C#125个基本的面试问答清单
- 给一千万个数据量的文件排序
- 移动端 项目开发经验集锦
- Java基础语法(上)
- Java 时间(日期)相加处理
- 关于敏捷开发的26个心得
- 如何尽量避免引用jQuery
- 【提高学习效率】☞(利用WIN+R 快速打开 软件 及 网页 )
- 深入理解Android消息处理系统——Message、Looper、Handler