上一篇内容,我们探讨了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

但是,我的程序运行到九九重阳数时,就基本停止运行了,像上图这个状态,不晓得要等多久了……

打开网易新闻 查看精彩图片

等待中……

大家有没有好办法呢?输出指定位数的自幂数?如何让它更快呢?欢迎小伙伴们下方留言讨论。这个问题留给小伙伴们自己去思考吧,兴许关注我,哪天会有答案揭晓哦!