【100个python算法超详细讲解@谷哥技术

1.问题描述
本节要研究回文素数的问题,先来看看什么是回文素数。
所谓回文素数指的是,对一个整数n从左向右和从右向左读其数值都相同且n为
素数,则称整数n为回文素数。
对于偶数位的整数,除了11以外,都不存在回文素数。即所有的4位整数、6位
整数、8位整数等都不存在回文素数。下面列出两位和三位整数中包含的所有回文素
数。
两位回文素数:11。
三位回文素数:101,131,151,181,191,313,353,373,383,727,757,
787,797,919,929。
本节要求解的问题是:求出所有不超过1000的回文素数。
2.问题分析
本题仍旧要使用判断素数的方法。判断素数的方法读者已经比较熟悉了,因此
本题实际要解决的问题在于如何求一个整数的回文数。
我们采用的方法是穷举法。对1000以内的每一个整数n进行考察,判断n是否为
回文数。如果n是回文数,再判断它是否为素数,对于既是回文数也是素数的整数n
就是我们要求的回文素数,将其打印输出即可。
由于题目要求解的是所有不超过1000的回文素数,因此最后的结果中应该包含
两位和三位的回文数。
我们采用穷举法来构造一个整数并求与其对应的反序数,若整数与其反序数相
等,则该整数是回文数。
3.算法设计
在问题分析中我们已经确定要采用穷举法逐一考查1000以内的每个整数,因此
本题的算法设计可以采用循环结构来完成。
通过三重循环来遍历所有1000以内的整数。用3个循环变量来构造整数n,同
时,这3个循环变量反序便可以构造出n的反序数m。其中,特别要注意的是如果n的
个位为0,接下来要做的就是比较m和n的值是否相等,如果相等则表明整数m是回
文数。再来判断n是否是素数,如果n也同时为素数,则n为回文素数,将其打印出来
即可。
4.确定程序框架
程序的流程图如图5.9所示。

 5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 回文素数
# 判断参数n是否为素数
def fun(n):
for i in range(2, (n-1)//2):
if n % i == 0: # 偶数不是素数
return 0
return 1 # 返回1是素数
if __name__=="__main__":
print("1000以内的回文素数:")
for i in range(0, 9+1): # 穷举第一位
for j in range(0, 9+1): # 穷举第二位
穷举第 位
for k in range(0, 9+1): # 穷举第三位
n = i * 100 + j * 10 + k # 计算组成的整数
m = i + j * 10 + k * 100 # 计算对应的反序数
if i == 0 and j == 0: # 处理整数的前两位为0的情况
m = m // 100
elif i == 0: # 处理整数的第一位为0的情况
m = m // 10
if n > 10 and n == m and fun(n): # 若大于10且为回文数则输出
print("%d\t" %n, end="")

6.运行结果
在PyCharm下运行程序,结果如图5.10所示。

7.拓展训练
考虑是否有其他方法可以判断一个整数是否为回文素数。 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐