问题:给出两个数a,b(5 <= a < b <= 100,000,000),求出该区间内的回文素数
思路:因为先生成回文再判断素数时,回文区间是[0,9999];而先判断素数再判断是否是回文时,数字区间是[0,100000000]。明显先生成回文再判断素数所使用的区间范围小,所以使用第一种方式
解法1
生成回文时,先生成奇数位的回文,再生成偶数位的回文,然后再判断是否是素数。使用sprintf将数字转为字符串,然后根据奇数位和偶数位生成回文字符串,接着使用atol转为整数,再判断是否是素数
代码见:https://github.com/wuli2496/OJ/blob/master/usaco/Prime%20Palindromes/pprime.cpp
解法2
在解法1的基础上做了优化,因为偶数位的回文除了11外,其它都可以被11整除
代码见:https://github.com/wuli2496/OJ/blob/master/usaco/Prime%20Palindromes/pprime_optimize.cpp
解法3
在生成奇数位回文时,在中间为分界点,左边区间是[0,999],右边是左边的镜像。通过数学计算方式来实现
代码见:https://github.com/wuli2496/OJ/blob/master/usaco/Prime%20Palindromes/pprime_no_sprintf.cpp
解法4:
生成回文时,使用递归算法
代码见:https://github.com/wuli2496/OJ/blob/master/usaco/Prime%20Palindromes/pprime_recursion.cpp