13 - 数之吟唱:回文数
本帖最后由 鱼C-小师妹 于 2021-8-1 13:40 编辑https://www.bilibili.com/video/BV1HT4y1K7DY?p=15
经过前面几讲的铺垫洗礼,童鞋们已经算上手 Python 啦!
用到的那些基础知识像:输入、输出、循环、条件判断等等..
就是日常开发中最常用的语法概念。
从这一讲开始,我们进阶到另一个阶段:
解决各种与“数”相关的问题。
现如今我们的生活中无时无刻不被数字充满~
人类是依靠手指发明出的数字,理解了数量。
而数字的发明又促成了农耕革命和书写文字的诞生。
可以说,发明数字对于人类社会的发展具有决定性的作用。
人们又通过不同规则从无穷无尽的数字中创造了一些有“意义”的种类:
勾股数、黑洞数、亲密数、自守数、回文数、高次方尾数、完数等等等..
而本阶段,我就来带大家通过写程序来将这些数一一拿下~
第一个要拿下的就是:回文数
老粉应该知道小师妹很早之前发过一条动态:
没错啦,上面的车牌就是回文数!
回文”是指正读反读都一样的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。
在数学中也有这样一类数字有这样的特征,称为回文数。
设 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 的位置,以此类推。
说的稍微复杂些,代码其实很简单:
i = 0
while a != 0: # 从低位到高位分解数a的每一位,存于数组m~m
m = a % 10
a //= 10
i += 1
既然能拆解数字,那么也要将数组中元素重新组合成一个新数。
拆分时变量 a 的最高位仍然存储在数组中下标最大的位置,根据“回文数”定义,新数中数据的顺序与 a 中数据的顺序相反。
所以我们按照下标从大到小的顺序分别取出数组中的元素组成新数 f。
由几个数字组成一个新数时只需用每一个数字乘以所在位置对应的权值,然后相加即可。
在编程过程中应该有一个变量 t 来存储每一位对应的权值,个位权值为 1,十位权值为 10,百位权值为 100,以此类推。
所以可以利用循环,每循环一次,t的值就扩大 10 倍。
对应的程序段如下:
while i > 0:
f += m * t # t记录某一位置对应的权值
t *= 10
i -= 1
上面过程如果理解了,流程图自己去画:
**** Hidden Message *****
还是那句话:
做好流程图,程序立刻出~
上代码:
m = * 5
count = 0
print("序号 数字 平方回文")
for n in range(1, 256):
f, i, t, a=0, 0, 1, n*n
squ = a
while a !=0:
m =a % 10
a //= 10
i += 1
while i > 0:
f += m * t
t *= 10
i -= 1
if f == squ:
count += 1
print("{:2}{:5}{:6}".format(count,n,n*n))
因为我们事先知道是 1 到 256 数字内,所以数组长度为 5 就好。
关于 format 美化部分,大家去看小甲鱼老师最新版 py 教程,解锁更多玩法:
文字版请戳这里:字符串格式化语法参考
最终结果:
其实除了上面这种方法,还有另一种方式:
将每一位的数分离出来,然后比较对称位置上的数据,若相等,则此数是“回文数”。
这种方法适合于对一个整数进行判断。
核心过程都是拆分,留给你们当课后作业:
判断一个六位数是否为回文数
源码: 第一 楼上的第一是霸楼吗?那我就第二把! 口算得1,2,3,11,... 小师妹的课有点儿短{:5_102:} for i in range(1,257):
num = str(i ** 2)
if num == num[::-1]:
print(f'{i}的平方是回文数')
zhangyuesd 发表于 2021-6-23 16:16
for i in range(1,257):
num = str(i ** 2)
if num == num[::-1]:
漂亮~ 一行流:
print(*(f'{i}的平方是回文数' for i in range(1, 257) if str(i ** 2) == str(i ** 2)[::-1]), sep='\n') {:5_90:} 6 {:5_90:} x = 1
while x <= 256:
t = x*x
if str(t) == str(t)[::-1]:
print(x)
x += 1 {:10_256:} {:5_95:} {:5_90:} {:10_275:} 我写完了代码,但是python竟然不输出值是咋回事 感谢大佬讲解这么细 # 题干
# 通过写程序来打印出 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]) {:5_109:} 亲爱的小甲鱼,你要每天都快乐
页:
[1]
2