Python算法100例-3.1 回文数

完整源代码项目地址,关注博主私信'源代码'后可获取

  • 1.问题描述
  • 2.问题分析
  • 3.算法设计
  • 4.确定程序框架
  • 5.完整的程序
  • 6.问题拓展
  • 7.巧用字符串技巧

1.问题描述

打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数)。

2.问题分析

对于要判定的数n,计算出其平方后(存于a),按照“回文数”的定义要将最高位与最低位、次高位与次低位等进行比较,若彼此相等则为回文数。此算法需要知道平方数的位数,再一一将每一位分解并比较,此方法对于位数已知且位数不是太多的数来说比较适用。

此问题可借助数组来解决。将平方后的数值(a)的每一位进行分解,按从低位到高位的顺序依次暂存到数组中,再将数组中的元素按照下标从大到小的顺序重新将其组合成一个数k(如n=15,则a=225且k=522),若a等于k则可判定n为回文数。

3.算法设计

从低位到高位将某个整数拆分。对于一个整数(设变量名为a),无论其位数多少,若欲将最低位拆分则只需对10进行求模运算,即a%10;拆分次低位首先要想办法将原来的次低位作为最低位来处理,用原数对10求商可得到由除最低位之外的数形成的新数,且新数的最低位是原数的次低位,根据拆分最低位的方法将次低位求出,即先进行a//10运算,后进行a%10运算;对于其他位上的数算法相同。利用这个方法要解决的一个问题是,什么情况下才算把所有数都拆分完了呢?当拆分到只剩原数最高位时(即新数为个位数时),再对10求商的话,得到的结果肯定为0,可通过这个条件判断是否拆分完毕。根据题意,应将每次拆分出来的数据存储到数组中,原数的最低位存到下标为0的位置,次低位存到下标为1的位置,以此类推。程序段如下:

i = 0
while a != 0:                           # 从低位到高位分解数a的每一位,存于数组m[1]~m[16]m[i] = a % 10a //= 10i += 1

将数组中元素重新组合成一个新数。拆分时变量a的最高位仍然存储在数组中下标最大的位置,根据“回文数”定义,新数中数据的顺序与a中数据的顺序相反,所以我们按照下标从大到小的顺序分别取出数组中的元素组成新数k。由几个数字组成一个新数时只需用每一个数字乘以所在位置对应的权值,然后相加即可,在编程过程中应该有一个变量t来存储每一位对应的权值,个位权值为1,十位权值为10,百位权值为100,以此类推,所以可以利用循环,每循环一次,t的值就扩大10倍。对应的程序段如下:

while i > 0:k += m[i-1] * t # t记录某一位置对应的权值t *= 10i -= 1

4.确定程序框架

程序的流程图如图所示。

在这里插入图片描述

5.完整的程序

%%time
# 回文数if __name__ == '__main__':m = [1] * 17count = 0print("No.    number     it's square(palindrome)")for n in range(1, 256):                                 # 穷举n的取值范围k, i, t, a = 0, 0, 1, n*n                   # 计算n的平方squ = awhile a != 0:                       # 从低到高分解数a的每一位存于数组m[1]~m[16]m[i] = a % 10a //= 10i += 1while i > 0:k += m[i-1] * t         # t记录某一位置对应的权值t *= 10i -= 1if k == squ:count += 1print("%2d%10d%10d" % (count, n, n*n))
No.    number     it's square(palindrome)1         1         12         2         43         3         94        11       1215        22       4846        26       6767       101     102018       111     123219       121     14641
10       202     40804
11       212     44944
CPU times: user 2.72 ms, sys: 0 ns, total: 2.72 ms
Wall time: 1.99 ms

6.问题拓展

在上面的问题分析中,提到另一种判断“回文数”的方法,就是将数据中每一位的数分离出来,然后比较对称位置上的数据,若相等,则此数是“回文数”。此方法适合于对一个整数进行判断。

编程实现输入一个5位数,判断它是不是回文数,例如12321是回文数,个位与万位相同,十位与千位相同。

完整的程序如下:

%%time
# 回文数判断if __name__ == '__main__':x = int(input("请输入一个5位数整数:"))if x < 10000 or x > 99999:print("输入错误")else:ten_thousand = x // 10000                                   #拆分最高位万位thousand = x % 10000 // 1000                        #拆分千位ten = x % 100 // 10                                         #拆分十位indiv = x % 10                                                      #拆分个位if indiv == ten_thousand and ten == thousand:print("%d是回文数" %x)else:print("%d不是回文数" %x)
12321是回文数
CPU times: user 60.4 ms, sys: 11.3 ms, total: 71.7 ms
Wall time: 5.86 s

对于本题来说,给定的是一个5位数,对于中间位置的百位不需要再进行分离,因为它不与任何其他位置进行比较。但对偶数位的整数进行判断时,所有位置都要分离出来。在编程过程中除了保证程序的正确性外,效率也是很重要的。

7.巧用字符串技巧

本题编程只涉及整数回文数判断,所以可以将整数转换成字符串,再使用字符串的切片函数实现倒序,在判断两个字符串是否相等即可。

具体代码如下:

a=12321
str_a=str(a)
str_a_reversed=str_a[::-1]
str_a_reversed
str_a==str_a_reversed
True
%%time
# 巧用字符串判断回文数
if __name__ == '__main__':m = [1] * 17count = 0print("No.    number     it's square(palindrome)")for n in range(1, 256):                                 # 穷举n的取值范围m=pow(n,2)str_m=str(m)str_m_reversed=str_m[::-1]if str_m==str_m_reversed:count += 1print("%2d%10d%10d" % (count, n, n*n))
No.    number     it's square(palindrome)1         1         12         2         43         3         94        11       1215        22       4846        26       6767       101     102018       111     123219       121     14641
10       202     40804
11       212     44944
CPU times: user 509 µs, sys: 0 ns, total: 509 µs
Wall time: 493 µs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/509142.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H.266参考软件VTM各版本的性能差异

VTM&#xff08;VVC Test Model&#xff09;&#xff0c;是H.266视频编码标准的参考软件&#xff0c;即是VVC spec.的一种参考实现&#xff0c;代码里包括了H.266的软件编码器和软件解码器实现&#xff0c;代码地址如下&#xff1a; https://vcgit.hhi.fraunhofer.de/jvet/VVCS…

如何做代币分析:以 INJ 币为例

如何做代币分析&#xff1a;以 INJ 币为例 作者&#xff1a; lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;INJ 代币仪表板 &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作…

tomcat nginx 动静分离

实验目的:当访问静态资源的时候&#xff0c;nginx自己处理 当访问动态资源的时候&#xff0c;转给tomcat处理 第一步 关闭防火墙 关闭防护 代理服务器操作&#xff1a; 用yum安装nginx 然后写配置文件&#xff0c;yum安装的nginx主配置文件默认为/etc/nginx/nginx.conf

程序员如何选择职业赛道?

一、自我评估与兴趣探索 程序员选择职业赛道时&#xff0c;可以考虑以下几个关键因素&#xff1a; 1、兴趣与热情&#xff1a;首先要考虑自己的兴趣和热情&#xff0c;选择符合个人喜好和激情的领域&#xff0c;能够激励自己持续学习和进步。 2、技术能力&am…

乡村集中污水处理需要哪些工艺设备

乡村集中污水处理是解决乡村环境污染问题的重要举措&#xff0c;而要实现高效的污水处理&#xff0c;必须配备合适的工艺设备。以下是乡村集中污水处理常用的工艺设备&#xff1a; 1. 溶氧设备&#xff1a;在污水处理过程中&#xff0c;溶解氧的供给对于维持微生物生长和有机物…

绝地求生:¥PUBG财富秘籍¥ 我在荣都砸锅卖铁之我要当首富

在荣都市场系统上线以来&#xff0c;想必现在大家已经很熟练的赚钱了。除了给的赏金任务给欧皇的巨额BR币以外&#xff0c;那肯定还有很多玩家会收到各式各样奇葩奖励的任务&#xff0c;下面看看这些奇葩任务。 但也有欧皇任务给了巨额RP币 除了做任务&#xff0c;当然还有去摸…

蓝桥杯倒计时 41天 - 二分答案-最大通过数-妮妮的月饼工厂

最大通过数 思路&#xff1a;假设左边能通过 x 关&#xff0c;右边能通过 y 关&#xff0c;x∈[0,n]&#xff0c;通过二分&#xff0c;在前缀和中枚举右边通过的关卡数&#xff0c;保存 xy 的最大值。 #include<bits/stdc.h> using namespace std; typedef long long ll…

毛细管的工作原理

毛细管的工作原理&#xff1a; 毛细管是制冷系统常用的节流装置&#xff0c;毛细管一般指内径为0.4~2.0mm的细长铜管。 作为制冷系统的节流机构&#xff0c;毛细管是最简单的一种&#xff0c;因其价廉、选用灵活&#xff0c;故广泛用于小型制冷装置中&#xff0c;最近在较大制…

【王道操作系统】ch1计算机系统概述-06虚拟机

文章目录 【王道操作系统】ch1计算机系统概述-06虚拟机01传统计算机02虚拟机的基本概念&#xff08;1&#xff09;第一类虚拟机管理程序&#xff08;2&#xff09; 第二类虚拟机管理程序&#xff08;3&#xff09; 两类虚拟机管理程序的对比 【王道操作系统】ch1计算机系统概述…

vulhub中Wordpress 4.6 任意命令执行漏洞复现

由于Mysql初始化需要一段时间&#xff0c;所以请等待。成功运行后&#xff0c;访问http://your-ip:8080/打开站点&#xff0c;初始化管理员用户名和密码后即可使用&#xff08;数据库等已经配置好&#xff0c;且不会自动更新&#xff09;。 发送如下数据包&#xff0c;可见/tmp…

【EI会议征稿通知】第四届控制与智能机器人国际学术会议(ICCIR 2024)

第四届控制与智能机器人国际学术会议&#xff08;ICCIR 2024&#xff09; 2024 4th International Conference on Control and Intelligent Robotics 第四届控制与智能机器人国际学术会议&#xff08;ICCIR 2024&#xff09;由华南理工大学自动化科学与工程学院主办&#xff…

从零开始学习Netty - 学习笔记 -Netty入门【半包,黏包】

Netty进阶 1.黏包半包 1.1.黏包 服务端代码 public class HelloWorldServer {private static final Logger logger LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());public static void main(String[] args) {NioEventLoopGroup bossGroup new NioEventL…