习题解析之:寻找回文素数
【问题描述】
如果一个整数是素数,同时其对应的字符串是回文字符串时,便称其为回文素数。例如,131 既是素数,其对应的字符串131又是回文字符串,所以 131 是回文素数。
输入一个正整数 n , 请你在一行内输出从小到大排列的小于这个数的所有回文素数,每个数字后面一个空格。
输入格式
输入一个正整数
输出格式
一行内输出从小到大排列的小于这个数的所有回文素数,每个数字后面一个空格。
示例
输入:
191
输出:
2 3 5 7 11 101 131 151 181
【编程思路】
判断一个整数 n 是否为素数的方法是:
小于 2 的整数肯定不是素数(最小的素数是 2)。
整数 2 是素数。
对于大于的整数 n,若 n 是偶数,则 n 不是素数。
若 n 是奇数,用3~sqrt(n)中的每一个奇数 i 去除 n ,若某一个 i 能被 n 整除,则 n 不是素数;否则,n 是素数。
该操作可定义为一个函数,如下:
def is_prime(n):
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for i in range(3,int(n ** 0.5) + 1,2):
if n % i == 0:
return False
return True
要找出小于 n 的所有回文素数,用循环 for i in range(2,n): 对 2 ~ n - 1 这个范围的整数进行穷举,若某个整数 i 既是素数,其对应的字符串又是回文字符串,则输出它。
判断一个整数 n 对应的字符串是否是回文字符串,只需要判断该整数对应的字符串 str(n) 与其逆序字符串 str(n)[::-1] 是否相等即可。即 str(n) == str(n)[::-1] 的值若为 True,则 str(n) 是回文字符串。
编写的源程序如下:

注意:程序中判断回文素数的条件最好写成 if str(i) == str(i)[::-1] and is_prime(i):,因为回文的判断相对简单,这样若整数 i 不是回文数的话,按 and 运算的短路特性,后面的素数判断不执行;
若写成 if is_prime(i) and str(i) == str(i)[::-1] : ,则每个数都会执行素数判断的函数,这样程序效率相对较低。
浙公网安备 33010602011771号