鱼C论坛

 找回密码
 立即注册
查看: 8117|回复: 23

[技术交流] 13 - 数之吟唱:回文数

[复制链接]
发表于 2021-5-31 20:48:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 鱼C-小师妹 于 2021-8-1 13:40 编辑



Numbers.png

经过前面几讲的铺垫洗礼,童鞋们已经算上手 Python 啦!

用到的那些基础知识像:输入、输出、循环、条件判断等等..

就是日常开发中最常用的语法概念。

从这一讲开始,我们进阶到另一个阶段:

解决各种与“数”相关的问题。

现如今我们的生活中无时无刻不被数字充满~

人类是依靠手指发明出的数字,理解了数量。

而数字的发明又促成了农耕革命和书写文字的诞生。

可以说,发明数字对于人类社会的发展具有决定性的作用。

人们又通过不同规则从无穷无尽的数字中创造了一些有“意义”的种类:

勾股数、黑洞数、亲密数、自守数、回文数、高次方尾数、完数等等等..

而本阶段,我就来带大家通过写程序来将这些数一一拿下~

第一个要拿下的就是:回文数

老粉应该知道小师妹很早之前发过一条动态:

2021-05-31_20-41-14.jpg

没错啦,上面的车牌就是回文数!

回文”是指正读反读都一样的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。

在数学中也有这样一类数字有这样的特征,称为回文数。

设 n 是一任意自然数。

若将 n 的各位数字反向排列所得自然数 n1 与 n 相等,则称 n 为回文数。

很简单是不是,我们稍微升级下难度。

通过写程序来打印出 1 - 256 中其平方是“回文数”的数。

对于要判定的数 n,计算出其平方后(存于 a),按照“回文数”的定义要将最高位与最低位、次高位与次低位等进行比较,若彼此相等则为回文数。

上面的算法我们需要知道平方数的位数,再逐个将每一位分解并比较,对于位数已知且位数不是太多的数来说比较适用。

我们需要借助数组来完成,将平方后的数值(a)的每一位进行分解。

按从低位到高位的顺序依次暂存到数组中,再将数组中的元素按照下标从大到小的顺序重新将其组合成一个数 k,若 a 等于 k 则可判定 n 为回文数。

举个例子吧,如 n=11,则 a=121 且 k=121,那么 n 是回文数。

对于一个整数,无论其位数多少,若欲将最低位拆分则只需对 10 进行求模运算,即 a%10;

拆分次低位首先要想办法将原来的次低位作为最低位来处理。

用原数对 10 求商可得到由除最低位之外的数形成的新数,且新数的最低位是原数的次低位。

根据拆分最低位的方法将次低位求出,即先进行 a//10 运算,后进行 a%10 运算;

快速过下 /、//、% 的区别:

  • // 表示整数除法,返回整数 比如 7//3 结果为 2
  • / 表示浮点数除法,返回浮点数 (即小数) 比如 8/2 结果为 4.0
  • % 表示取余数 比如 9%4 结果为 1

对于其他位上的数算法相同。

利用这个方法要解决的一个问题是,什么情况下才算把所有数都拆分完了呢?

当拆分到只剩原数最高位时(即新数为个位数时),再对 10 求商的话,得到的结果肯定为 0,可通过这个条件判断是否拆分完毕。

我们将每次拆分出来的数据存储到数组中,原数的最低位存到下标为 0 的位置,次低位存到下标为  1 的位置,以此类推。

说的稍微复杂些,代码其实很简单:

  1. i = 0
  2. while a != 0:                           # 从低位到高位分解数a的每一位,存于数组m[1]~m[16]   
  3.         m[i] = a % 10   
  4.         a //= 10   
  5.         i += 1
复制代码

既然能拆解数字,那么也要将数组中元素重新组合成一个新数。

拆分时变量 a 的最高位仍然存储在数组中下标最大的位置,根据“回文数”定义,新数中数据的顺序与 a 中数据的顺序相反。

所以我们按照下标从大到小的顺序分别取出数组中的元素组成新数 f。

由几个数字组成一个新数时只需用每一个数字乘以所在位置对应的权值,然后相加即可。

在编程过程中应该有一个变量 t 来存储每一位对应的权值,个位权值为 1,十位权值为 10,百位权值为 100,以此类推。

所以可以利用循环,每循环一次,t的值就扩大 10 倍。

对应的程序段如下:

  1. while i > 0:
  2.     f += m[i-1] * t # t记录某一位置对应的权值   
  3.     t *= 10   
  4.     i -= 1
复制代码

上面过程如果理解了,流程图自己去画:

游客,如果您要查看本帖隐藏内容请回复


还是那句话:

做好流程图,程序立刻出~

上代码:

  1. m = [0] * 5
  2. count = 0
  3. print("序号 数字 平方回文")
  4. for n in range(1, 256):
  5.     f, i, t, a=0, 0, 1, n*n
  6.     squ = a

  7.     while a !=0:                     
  8.       m[i] =a % 10
  9.       a //= 10
  10.       i += 1

  11.     while i > 0:
  12.         f += m[i-1] * t
  13.         t *= 10
  14.         i -= 1

  15.     if f == squ:
  16.         count += 1
  17.         print("{:2}{:5}{:6}".format(count,n,n*n))
复制代码

因为我们事先知道是 1 到 256 数字内,所以数组长度为 5 就好。

关于 format 美化部分,大家去看小甲鱼老师最新版 py 教程,解锁更多玩法:
2021-07-10_21-02-59.jpg

文字版请戳这里:字符串格式化语法参考

最终结果:
2021-07-11_20-01-50.jpg

其实除了上面这种方法,还有另一种方式:

  1. 将每一位的数分离出来,然后比较对称位置上的数据,若相等,则此数是“回文数”。
复制代码

这种方法适合于对一个整数进行判断。

核心过程都是拆分,留给你们当课后作业:

判断一个六位数是否为回文数


源码: 13.py.zip (706 Bytes, 下载次数: 13, 售价: 6 鱼币)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-1 10:37:25 | 显示全部楼层
第一
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-1 15:43:50 | 显示全部楼层
楼上的第一是霸楼吗?那我就第二把! 口算得1,2,3,11,...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-2 21:22:01 | 显示全部楼层
小师妹的课有点儿短
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-23 16:16:12 | 显示全部楼层
for i in range(1,257):
    num = str(i ** 2)
    if num == num[::-1]:
        print(f'{i}的平方是回文数')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-7-10 21:18:04 | 显示全部楼层
zhangyuesd 发表于 2021-6-23 16:16
for i in range(1,257):
    num = str(i ** 2)
    if num == num[::-1]:

漂亮~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-11 18:21:00 | 显示全部楼层
一行流:
  1. print(*(f'{i}的平方是回文数' for i in range(1, 257) if str(i ** 2) == str(i ** 2)[::-1]), sep='\n')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 20:31:08 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-25 12:30:33 From FishC Mobile | 显示全部楼层
6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-4 10:40:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 21:16:56 | 显示全部楼层
  1. x = 1
  2. while x <= 256:
  3.     t = x*x
  4.     if str(t) == str(t)[::-1]:
  5.         print(x)
  6.     x += 1
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-26 18:12:35 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-26 21:06:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 02:18:54 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 17:43:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-9 10:48:17 | 显示全部楼层
我写完了代码,但是python竟然不输出值是咋回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-9 11:46:57 | 显示全部楼层
感谢大佬讲解这么细
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-7 18:42:01 | 显示全部楼层
# 题干
# 通过写程序来打印出 1 - 256 中其平方是“回文数”的数。

import math as m
storagelist = ''
for i in range(1, 257):
    numberstorage = []
    numberstoragere = []
    number = int(m.pow(i, 2))
    for each in str(number):
        numberstorage.append(each)
        numberstoragere.insert(0, each)
    if numberstoragere == numberstorage:
        storagelist += (str(number)+ '、')
    else:
        pass

print('1-256中其平方是“回文数”的数有:%s' % storagelist[:len(storagelist)-1])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-7 19:13:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-27 10:28:29 | 显示全部楼层
亲爱的小甲鱼,你要每天都快乐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 17:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表