描述
回文素数是指一个数既是素数又是回文数。例如,131,既是素数又是回文数。用户输入一个正整数 n , 请你在一行内输出从小到大排列的的前n个回文素数,数字后面用一个空格进行分隔。
输入格式
输入一个正整数
输出格式
符合要求的回文素数
输入输出示例
输入:10
输出:2 3 5 7 11 101 131 151 181 191
解析:
这里有两个问题,一个是判定素数,一个是判定回文数,前者可以参考“判断素数函数”学习。判定一个数字是回文数字方法非常简单,将其转为字符串后,可以利用字符串的通用操作,对其进行逆向切片获得其逆序字符串,如果逆序的字符串与原字符串相同的话,刚其是回文数字。这里需要注意,因判定回文的计算量非常小,远小于素数的判定,所以编程程序时,先判定是否是回文,当其不是回文时,由于短路作用,程序不会再去判定其是否为素数,可以节约较多的运行时间。对于此类不确定循环次数的问题,一般不建议使用很大的数做range()参数的方法,如:
for i in range(100000000):
....
由于不确定循环多少次,如果需要输出的回文素数个数较多,可能会出现在循环次数内找不到足够多的解的情况。而用while循环,可以无限的循环下去,直到计数达到要求的数量为止,用break终止循环。
def is_prime(n):
"""判断素数,接受一个正整数n为参数,判断n是否为素数,返回布尔值"""
if n < 2: # 0 和 1 以及负数都不是素数
return False # False代表不是素数,返回调用函数之处
for i in range(2,int(n ** 0.5) + 1): # 两因子相同时,为保证取到右边界,需加1
if n % i == 0: # 从 2到n-1中如果存在一个数是i,使n 可以整除i,则n不是素数
return False
else: # 若for循环未遇到return正常结束,则n是素数
return True
n = int(input()) # 输入要寻找回文素数的个数n
i = 2 # 素数从2 开始,小于2的都不是素数
count = 0 # 设置计数器,用于计数
while count < n: # 构建循环,当计数小于n时进入循环
# 当i是回文字符串,且 i 是素数时
if str(i) == str(i)[::-1] and is_prime(i):
# 先判定是否是回文,不是回文就不需要断定是不是素数,可以减少计算量,提高效率
print(i,end = ' ') # 输出回文素数,后面跟一个空格
count = count + 1 # 每找到一个回文素数,计数增加1
i = i+ 1 # 继续判断下一个数
若有文件prime.py的内容如下:
import math
def is_prime(n):
"""判断素数,接受一个正整数n为参数,判断n是否为素数,返回布尔值"""
if n < 2: # 0 和 1 以及负数都不是素数
return False # False代表不是素数,返回调用函数之处
for i in range(2,int(n ** 0.5) + 1): # 两因子相同时,为保证取到右边界,需加1
# for i in range(2,int(math.sqrt(n)) + 1)
if n % i == 0: # 从 2到n-1中如果存在一个数是i,使n 可以整除i,则n不是素数
return False
else: # 若for循环未遇到return正常结束,则n是素数
return True
if __name__ == "__main__":
m = int(input())
.... 省略
可以修改本题的代码,通过引入自定义模块完成本题:
import prime
n = int(input()) # 输入要寻找回文素数的个数n
i = 2 # 素数从2 开始,小于2的都不是素数
count = 0 # 设置计数器,用于计数
while count < n: # 构建循环,当计数小于n时进入循环
# 当i是回文字符串,且 i 是素数时
if str(i) == str(i)[::-1] and prime.is_prime(i):
# 先判定是否是回文,不是回文就不需要断定是不是素数,可以减少计算量,提高效率
print(i,end = ' ') # 输出回文素数,后面跟一个空格
count = count + 1 # 每找到一个回文素数,计数增加1
i = i+ 1 # 继续判断下一个数
其他类似使用到素数判定的题目都可以使用这样的方法,通过定义模块和导入模块,实现代码的复用。