水仙花数-第12届蓝桥杯省赛Python真题精选

[导读]:超平老师的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。

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值