<Sicily>Prime Palindromes
一、题目描述
The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 100,000,000); both a and b are considered to be within the range .
二、输入
There are multiple test cases.
Each case contains two integers, a and b.
a=b=0 indicates the end of input.
三、输出
For each test case, output the list of palindromic primes in numerical order, one per line.
例如:
输入:
5 500
0 0
输出:
5
7
11
101
131
151
181
191
313
353
373
383
四、解题思路
题意:输入两个数a和b,找出a-b之间的所有既是质数,又是回文数。当a = b = 0是退出。
思路:这道题看似简单,只需要找出a到b之间的质数,然后从中找出是回文数就OK了。可是题目有一个要求程序运行时间不能超过1秒,而且a,b的范围达到5-100,000,000,很容易超时,所以求质数要用最快的方法。我在这个超时上折腾了好长时间,差不多有两个小时。
1、判断是否是回文数
要判断数i是否是回文数,每一次操作不断地对其求取10的余数,产生新的数对原来的数进行翻转,翻转后的数跟原来的数比较,看是否相等,如果相等是回文数否则不是。如下图:
int num = i;
int temp = 0;
while(num)
{
temp *= 10;
temp += num%10;
num /= 10;
}
2、判断是否是质数
有一个定理:如果一个数是合数,那么它的最小质数肯定小于等于的二次方根。
按照以上定理,如果一个数能被它的最小质因数整除,那它是合数,即不是质数。所以判断一个数是否是质数,只需判断它是否能被小于它开根号后的所有数整除,这样做的运算练少很多从而提高了效率。
3、使用筛法求质数,用内存换时间
先建立一个boolean类型的数组,用来存储你要判断某个范围内自然数中的质数,例如,你要输出小于10000005的质数,你需要建立一个大小为10000005(建立10000005个存储位置是为了让数组位置与其大小相同)的boolean数组,初始化为true。是偶数的都不是质数。
其次用以上的方法求的第一个质数(例如3),然后将是3的倍数的数全置为false(2除外)位置上置为false。然后是3的倍数的全置为false(3除外),一直到10000005平方根,这样的话把不是质数的位置上置为false了,剩下的全是质数了
4、用一个大的数组保存
再求出其中是回文数的部分就是我们需要找的,再根据输入的a,b值,在数组中找出在a,b之间满足要求的回文质数。
五、代码
#include<iostream>
#include<math.h>
using namespace std;
#define maxn 10000005
bool isPrimeList[maxn]; //存放质数
int palindromeList[maxn]; //存放回文数
int main()
{
int i;
isPrimeList[0] = false;
isPrimeList[1]= false;
isPrimeList[2] = true;
for(i = 3; i < maxn; i+=2) //初始化质数
{
isPrimeList[i] = true;
isPrimeList[i+1] = false; //偶数不是质数
}
int n = sqrt(maxn); //通过开根号求质数
for(i = 3; i < n; i+= 2)
{
if(!isPrimeList[i]) continue;
for(int j = i; j*i < maxn; j++)
{
isPrimeList[j*i] = false;
}
}
int palCount = 0;
for(i = 0; i < maxn; i++) //求回文数组
{
int num = i;
int temp = 0;
while(num) //求num的翻转数
{
temp *= 10;
temp += num%10;
num /= 10;
}
if(i == temp && isPrimeList[i]) //这个回文数又是质数
{
palindromeList[++palCount] = i;
}
}
int low, high;
cin >> low >> high;
while(low || high)
{
for(i = 0; palindromeList[i] < low; i++)
continue;
for(;palindromeList[i]<= high && palindromeList[i]!=0;i++)
cout<<palindromeList[i]<<endl;
cin >> low >> high;
}
return 0;
}
<Sicily>Prime Palindromes的更多相关文章
- USACO 1.5 Prime Palindromes
Prime Palindromes The number 151 is a prime palindrome because it is both a prime number and a palin ...
- 4190. Prime Palindromes 一亿以内的质数回文数
Description The number 151 is a prime palindrome because it is both a prime number and a palindrome ...
- P1217 [USACO1.5]回文质数 Prime Palindromes(求100000000内的回文素数)
P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...
- 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes
P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...
- luogu P1217 [USACO1.5]回文质数 Prime Palindromes x
P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...
- USACO Prime Palindromes 构造回文数
这道题目一点也不卡素数的判断 就是朴素的sqrt(n) 也不卡 所以~放心的用吧. 构造回文的时候看了HINT 其中是这么写的: Generate palindromes by combining d ...
- 回文质数 Prime Palindromes
题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...
- P1217 [USACO1.5]回文质数 Prime Palindromes
题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...
- 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes【取回文数/数论/字符串】
题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...
随机推荐
- codevs 3372 选学霸(hash+并查集+多重背包)
先通过并查集处理出来有多少种不同的集合,每一个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候能够通过hash处理出来每一个数目同样的集合的个数. 这样以人数为权值.个数为限制进行 ...
- poj3071之概率DP
Football Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2667 Accepted: 1361 Descript ...
- [雅礼NOIP2018集训 day4]
感觉状态极差啊,今天居然爆零了 主要是以下原因: 1.又是T1看错题肝了两个小时,发现题意理解错误瞬间心态爆炸 2.T2交错了文件名 3.T3暴力子任务和正解(假的)混在一起,输出了两个答案 都想为自 ...
- mysql裸文件备份XtraBackup (innobackupex)
结构如下: 热备分为逻辑备份和裸文件备份. 裸文件备份比逻辑备份在速度上更快一些,因为它在底层复制数据文件.世界上唯一一款开源的,能够对INNODB和XtrDB数据库进行热备的开源工具. 他的优点是备 ...
- sas与mysql连接方法
2012年8月11日 sas 9.1.3 版本 与mysql 连接 测试,可以与数据库连接1 通过odbc 直接连通 pass through connect to odbc create tabl ...
- Spark Streaming 总结
这篇文章记录我使用 Spark Streaming 进行 ETL 处理的总结,主要包含如何编程,以及遇到的问题. 环境 我在公司使用的环境如下: Spark: 2.2.0 Kakfa: 0.10.1 ...
- (转载) Android-Spinner的使用以及两种适配器
目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 程序员8月书讯 项目管理+代码托管+文档协作,开发更流畅 Android-Spinner的使用以及两种适配器 201 ...
- 「JavaSE 重新出发」02.02 引用数据类型
引用(复合)数据类型 1. 枚举类型 例: 枚举类型 Size 的声明: enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 声明 Size 类型变量: ...
- SpringCloud学习笔记(18)----Spring Cloud Netflix之服务网关Zuul原理
1. Zuul的工作机制 Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行.过滤器之间没有直接的相互通信,他们是通过一个RequestContext的静态类来进行数据传递的.Requet ...
- Tarjan专题
前排Orz tarjan tarjan算法在图的连通性方面有非常多的应用,dfn和low数组真是奥妙重重(并没有很搞懂反正背就完事了) 有向图强连通分量 #include<iostream> ...