[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第56讲。
水仙花数,本题是2021年4月24日举办的第12届蓝桥杯青少组Python编程省赛真题,第12届一共有两场省赛,这是第二场。题目要求对于给定的正整数N,编程计算100到N之间水仙花数量的个数。
先来看看题目的要求吧。
一.题目说明
提示信息:
“水仙花数”是指一个三位正整数,其各位数字立方的和等于该数本身。
例如:153是一个“水仙花数”,因为13+53+33等于153。
编程实现:
给定一个正整数N,判断100到N之间有多少个“水仙花数”。
输入描述:
输入一个正整数N(100 < N < 1000)
输出描述:
输出100到N之间(包含100和N)有多少个“水仙花数”
样例输入:
160
样例输出:
1
二.思路分析
这是一道经典的数论问题,考查的知识点主要包括循环、函数和枚举算法。
数学家们在研究数字立方和“黑洞”时,发现下面的等式:
观察上述等式,可以发现,每个数字,从自身出发,又回到了自身,由于这种只钟爱自己的性质,人们称其为自恋数(narcissistic number)。
而水仙花数的名称来源于古代希腊神话中的美丽少年纳西索斯(Narcissus),他因为沉迷于自己的美貌而无法自拔,最终变成了一朵水仙花。
判断水仙花的思路非常直观,将三位数进行分解,分别找出其个位、十位和百位上的数字,并计算它们的立方和,然后判断立方和是否等于三位数本身。
所以,这里的关键是如何拆分三位数,通常有如下两种方法:
-
字符串方法
-
数学方法
字符串相对比较简单,就是将数字先转成字符串,然后分别取出每一个字符,再转换成数字进行运算。
而数学方法则是利用除法,计算商和余数,从而得到个位、十位和百位。
题目要统计水仙花的个数,这就需要枚举100到n之间的所有整数,逐一判断。为了简化代码,可以定义一个函数,用于判断指定数字是否为水仙花数。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们使用分别两步来编写程序:
-
自定义函数
-
循环统计
1. 自定义函数
根据前面的思路分析,我们有两种方法来获取三位数的个位、十位和百位。
先采取字符串的方式,定义函数如下:
代码比较简单,说明两点:
1). 注意字符串和数字之间的转换,先将数字n转成字符串,遍历字符串时,再将每个字符转成数字;
2). 直接返回s == n的结果,这种写法更为简洁,如果二者相等,返回True,否则返回False。
接下来使用数学方法,定义函数如下:
代码也比较简单,注意在进行除法运算时需要使用整除运算符//,而不是/。
2. 循环统计
有了自定义函数,接下来只需要循环统计即可,代码如下:
代码非常简单,注意一点,题目要求统计的是100到n(包含100和n)之间的水仙花数,所以range()函数的两个参数分别是100和n + 1。
至此,整个程序就全部完成了,你也可以输入不同的数字来测试效果啦。
四.总结与思考
本题代码在12行左右,涉及到的知识点包括:
-
循环语句,主要是for...in;
-
条件语句;
-
字符串和数字的转换;
-
自定义函数;
本题难度一般,关键点在于如何获取三位数的个位、十位和百位,本题介绍了两种经典方案,分别是字符串方法和数学方法。
对于Python而言,字符串和数字的互相转换非常方便,用起来更为简单,也是首选方法。从编程的角度来讲,使用数学方法更加的通用,也更为灵活,所以我们必须熟练掌握这两种解决方案。
在数论中,水仙花数也被称为超完全数字不变数、自幂数、阿姆斯特朗数等。
自幂数用来描述一个N位非负整数,其各位数字的N次方和等于该数本身。水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。
其它位数的自幂数名字,如下:
一位自幂数:独身数
两位自幂数:没有
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
超平老师给你留一道思考题,如何计算并输出所有的四叶玫瑰数,赶紧动手试试吧。
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要源码的,可以移步至“超平的编程课”gzh。