上一篇内容,我们探讨了Python打印输出“水仙花”数的几种方式(参见打印“水仙花数”,只有一种方法?Python带你用多种方式实现输出)。
水仙花
今天,我们来打印另一个有意思的数字,叫“十全十美”数!如果对Python不敢兴趣直接拉到文末会有答案!
十全十美数
01自幂数
接上篇内容讲,其实,水仙花数(Narcissisticnumber),也叫超完全数字不变数(pluperfectdigitalinvariant,PPDI)、自幂数、自恋数、阿姆斯特朗数(Armstrongnumber)等等。
它的定义
上一篇中打印输出的水仙花数其实是自幂数的一种,特指一个3位数,数字中每一位数的3次幂之和等于数字本身(例如:1^3 5^3 3^3=153)
那么,各个位数的自幂数如何称呼呢?
一位自幂数:独身数
两位自幂数:没有
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
今天,我们用Python把它们都找出来。名字挺有趣,不是吗?
02如何打印输出自幂数
自幂数是指一个n位数N,它的每个位上的数字的n次幂之和等于N本身。
其实,和上篇内容提到的几种输出“水仙花”数的方法是通用的。
怎么找呢?
思路是这样的:先构造一个字典,用来存储各个位数的自幂数的名称;然后,定义一个函数用来判断任意一个数据是否是自幂数(参考前篇水仙花数打印内容);最后,我们循环遍历各个位数的数,打印输出自幂数及名称。
我们选择最后一种Pythonic的方法来打印输出10位以内的自幂数。
选个方便点的方法
【构造字典】存储各个位数自幂数的名称
info_dict={1:'独身数',2:'没有自幂数',3:'水仙花数',4:'四叶玫瑰数',5:'五角星数',6:'六合数',7:'北斗七星数',8:'八仙数',9:'九九重阳数',10:'十全十美数',}
【定义函数】判断一个数是否为自幂数
判断一个数是否为自幂数
defnarcissistic_number(num):
s=str(num)
length=len(s)
sum_num=0
ifsum(pow(int(d),length)fordins)==num:
print(%d是%d位【%s】%(num,length,info_dict[length]))
复制代码按图示对齐即可运行。
【循环遍历】输入最大数据位数,打印输出该范围内的所有自幂数
max_num=int(input('请输入数据位数:'))
fornuminrange(0,10**max_num):
narcissistic_number(num)
这样,我们就可以通过输入数据范围来获取这个范围内的所有自幂数了。
03如何让获取速度更快?
我们来看下上面程序运行效果:
自幂数结果
当然,最后要告诉大家十全十美数是什么了
是这个数:4679307774
但是,我的程序运行到九九重阳数时,就基本停止运行了,像上图这个状态,不晓得要等多久了……
等待中……
大家有没有好办法呢?输出指定位数的自幂数?如何让它更快呢?欢迎小伙伴们下方留言讨论。这个问题留给小伙伴们自己去思考吧,兴许关注我,哪天会有答案揭晓哦!
热门跟贴