因为题目太长以后都默认放在后面了,可以通过右边的目录快速定位
思路
构建回文数-> 判断是否为质数
思路是先构造回文数,然后判断这个数的否为质数
题目给的范围很大,所有如果使用暴力的方法肯定是超时,因为对那个筛质数不是很熟,所以想用 先构造回文数 ,再 判断是否为质数 的方式来节省一定的时间,毕竟所有的偶数除去,少了一大半,然后又是回文数,所以剩下的数并不是很多。
build(int l, int r, int cnt, int len)
方法用于生成回文数
其中的
l
为最高位的下标,r
为最低位下标,cnt
用于统计当前已经构造了多少位,每一位构造的时候只需要使用这一位的下标然后进行枚举j
在指定范围内pow(10, index) * j
加到sum
即可,这样从两头向中间,对应的两个位置枚举相同的数即可。
特判
- 长度为
1
的时候,从5
开始,int j = (len == 1 ? 5 : (r == 0 ? 1 : 0));
- 不能越界
lboard <= sum <= rboard
,if (sum + temp > rboard) break;
和if (sum >= lboard && cnt == 0 && isPrime(sum))
len
为奇数的时候,最后l
和r
会正好相等,只加其中一个
1 | if (l == r) { |
Coding
1 |
|
题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b](5 <= a < b <= 100,000,000)
( 一亿)间的所有回文质数;
输入输出格式
输入格式:
第 1 行: 二个整数 a 和 b .
输出格式:
输出一个回文质数的列表,一行一个。
输入输出样例
输入样例#1:
1 | 5 500 |
输出样例#1:
1 | 5 |
说明
Hint 1: Generate the palindromes and see if they are prime.
提示 1: 找出所有的回文数再判断它们是不是质数(质数).
Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
题目翻译来自NOCOW。
USACO Training Section 1.5
产生长度为5的回文数:
1 | for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是质数 |