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.mzph.cn/news/719190.shtml

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

相关文章

在国内如何申请US,visa卡?

随着跨境与AI的发展大家对美国虚拟卡的需求也越来越多&#xff0c;比如说亚马逊、ebay、Etsy、ChatGPTPLUS、midjourney、POE等等软件以及海淘的需要&#xff0c;所以我们需要用到美国虚拟卡的场景就越来越多 如何获得一张US 虚拟信用卡&#xff1f; 方法很简单&#xff0c;点…

一线大厂软件测试面试题及答案解析,2024最强版...

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程&#xff0c;一周学完让你面试通过率提高90%&#xff01;&#xff08;自动化测试&#xff09; 1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上…

CNAN知识图谱辅助推荐系统

CNAN知识图谱辅助推荐系统 文章介绍了一个基于KG的推荐系统模型&#xff0c;代码也已开源&#xff0c;可以看出主要follow了KGNN-LS 。算法流程大致如下&#xff1a; 1. 算法介绍 算法除去attention机制外&#xff0c;主要的思想在于&#xff1a;user由交互过的item来表示、i…

OpenShift AI - 部署并使用 LLM 模型

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.15 RHODS 2.7.0 的环境中验证 文章目录 安装 OpenShift AI 环境安装 Minio 对象存储软件配置 Single Model Serving 运行环境创建项目和 Workbench准备模型和配置 Model Server访问 LLM 模…

DCTNet

DCTNet http://giantpandacv.com/academic/%E7%AE%97%E6%B3%95%E7%A7%91%E6%99%AE/%E9%A2%91%E5%9F%9F%E4%B8%AD%E7%9A%84CNN/CVPR%202020%20%E5%9C%A8%E9%A2%91%E5%9F%9F%E4%B8%AD%E5%AD%A6%E4%B9%A0%E7%9A%84DCTNet/ 一个对输入图像进行频域转换和选择的方法&#xff0c;达到…

python实现手机号归属地查询

手机上突然收到了某银行的短信提示&#xff0c;看了一下手机的位数&#xff0c;正好是11位。我一想&#xff0c;这不就是标准的手机号码吗&#xff1f;于是一个想法涌上心头——用python的库实现查询手机号码归属地查询自由。 那实现的效果如下&#xff1a; 注&#xff1a;电…

2.3_3 进程互斥的硬件实现方法

文章目录 2.3_3 进程互斥的硬件实现方法&#xff08;一&#xff09;中断屏蔽方法&#xff08;二&#xff09;TestAndSet指令&#xff08;三&#xff09;Swap指令 总结&#xff08;四&#xff09;互斥锁 2.3_3 进程互斥的硬件实现方法 学习提示&#xff1a; 1.理解各方法的原理 …

Python从0到100(二):Python语言介绍及第一个Pyhon程序

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

springcloud:3.3测试重试机制

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http:/…

UNIapp实现局域网内在线升级

首先是UNIapp 生成apk 用Hbuilder 进行打包 可以从网站https://www.yunedit.com/reg?gotocert 使用自有证书&#xff0c;目测比直接使用云证书要快一些。 发布apk 网站 用IIS发布即可 注意事项中记录如下内容 第一、需要在 iis 的MiMe 中添加apk 的格式&#xff0c;否则无法…

如何本地创建websocket服务端并发布到公网实现远程访问

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

如何实现飞书与金蝶无缝对接,提升业务效率与客户满意度?

一、客户介绍 某贸易有限公司是一家专业从事进口葡萄酒和高端烈酒销售的企业。在市场竞争日益激烈的今天&#xff0c;该公司始终坚持以客户为中心&#xff0c;以市场为导向&#xff0c;不断创新和进步。公司不仅注重传统销售渠道的拓展&#xff0c;还积极拥抱互联网&#xff0…

processing绘制笑脸

笑脸效果图&#xff1a; processing代码&#xff1a; void setup(){size(1000,1000);//Canvas sizebackground(#ffcc33);//Canvas background color } void draw(){ strokeWeight(12);//face-width12px fill(#ffffcc);//face arc(500,500,200,200,0,TWO_PI);//face-size strok…

【推荐算法系列十八】:DSSM 召回算法

参考 推荐系统中 DSSM 双塔模型汇总&#xff08;二更&#xff09; DSSM 和 YouTubeDNN 都是比较经典的 U2I 模型。 U2I 召回 U2I 召回也就是 User-to-Item 召回&#xff0c;它基于用户的历史行为以及用户的一些个人信息&#xff0c;对系统中的候选物品进行筛选&#xff0c;挑…

备考2024年上海高考数学:历年选择题真题练一练(2014~2023)

今天距离2024年高考还有三个多月的时间&#xff0c;今天我们来看一下2014~2023年的上海高考数学的选择题&#xff0c;从过去十年的真题中随机抽取5道题&#xff0c;并且提供解析。 后附六分成长独家制作的在线练习集&#xff0c;科学、高效地反复刷这些真题&#xff0c;吃透真题…

Sora爆火,数字人IP如何借助AIGC视频生成软件制作短视频营销?

ChatGPT、Sora等大模型的出现&#xff0c;创新了短视频内容创作生产方式。但目前Sora模型无法准确模拟复杂场景的物理特性&#xff0c;并且可能无法理解因果关系导致视频失真。 广州虚拟动力基于用户使用需求&#xff0c;推出了AIGC数字人视频生成平台&#xff0c;企业、品牌可…

Android MediaCodec 简明教程(五):使用 MediaCodec 编码 ByteBuffer 数据,并保存为 MP4 文件

系列文章目录 Android MediaCodec 简明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查询 Codec 信息&#xff0c;并创建 MediaCodec 编解码器Android MediaCodec 简明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…

每日一练:LeeCode-707. 设计链表 【链表+虚拟头结点+设计】

每日一练&#xff1a;LeeCode-707. 设计链表 【链表虚拟头结点设计】 思路设置虚拟头节点 本文是力扣 每日一练&#xff1a;LeeCode-707. 设计链表 【链表虚拟头结点设计】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode-70…

0101二阶与三阶行列式-行列式-线性代数

一 引例 求解二元一次方程组 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1a_{12}x_2b_1\\ a_{21}x_1a_{22}x_2b_2\\ \end{cases} {a11​x1​a12​x2​b1​a21​x1​a22​x2​b2​​ 解&#xff1a; 1 a 21 − 2 a 11 ⇒ x 2 a 11 b 2 − a…

MQL5学习之简单移动平均线MA的编写

昨天还是有点高估自己了&#xff0c;MACD相对较难一点&#xff0c;改学MA的编写&#xff0c;首先明确MA的计算&#xff0c;假如有4个值&#xff0c;p[1&#xff0c;2&#xff0c; 3&#xff0c; 4], period3, 则v[0]p[0], v[1]p[1],v[2](p[0]p[1]p[2])/32, v[3](v[2]*3p[3]-p…