通过率 23% · 提交 987 · 通过 225
所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。 例如153是水仙花数,153是一个3位数,并且153=1^3+5^3+3^3。
这类题属于华为 OD 机考真题方向中「100分 / 数学」方向的高频题型,通常考察对「100分 / 数学」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
第一行输入一个整数n,表示一个n位的正整数。n在3到7之间,包含3和7。 第二行输入一个整数m,表示需要返回第m个水仙花数。
返回长度是n的第m个水仙花数。个数从0开始编号。 若m大于水仙花数的个数,返回最后一个水仙花数和m的乘积。 若输入不合法,返回-1。
示例 1
输入示例
3 0
输出示例
153
153是第一个水仙花数.
示例 2
输入示例
9 1
输出示例
-1
9超出范围
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
对于特定的 n 位数 num,可以通过以下函数来判断其是否为一个 水仙花数。
如果我们想要知道某个特定范围的水仙花数有哪些,则可以在循环中对这个范围的数字进行遍历,每一个数字都进行 check() 函数的检查。
譬如,如果我们想知道所有 7 位数 的水仙花数有哪些,可以用如下的方式进行储存。
这样我们就可以计算得到所有的 7 位数的水仙花数为 [1741725, 4210818, 9800817, 9926315]。
n 的取值范围为 [3, 7],这意味着最大的位数可能是 7 位数。 如果我们每一次计算水仙花数,都去遍历所有的 7 位数,那么 时间复杂度为 O(10^7),必然超时。
很显然,对于某一个特定的 n 位数而言,其水仙花数是 固定的。 所以我们可以使用 打表法 来完成这个题目。
所谓 打表法,就是对一些已知的固定结果,进行预处理,而避免在题目中进行重复计算导致超时。
对于上述代码,我们只需要通过调整 n,就可以分别知道 3、4、5、6、7 位数的水仙花数是哪些。即:
我们把这些结果储存在一个 哈希表 res 中。
剩下的内容就非常简单了。首先需要判断输入是否存在违法数据,使用 try-except 语句 来完成。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有