水仙花数指的是在区间[100, 999]中的满足各位数的立方和等于其本身的数,例如371可以分解为3^3 + 7^3 + 1^3 = 371。无需多言,如何用Python优雅地解决这个问题,请看:
def find_narcissistic_num(start=100, end=999) -> list:
"""寻找指定范围内的水仙花数"""
# 确保寻找范围正确,有误则抛出异常
if start < 0 or end < 0 or start >= end or end > 999 or start < 100:
raise Exception('invalid range given')
result = list()
# 在区间[start, end]中寻找水仙花数
for item in range(start, end + 1):
# 将当前数字的各位拆分到一个元组中暂存
bit_in_num = tuple(map(lambda x: item // (10 ** x) % 10, range(len(str(item)))))
# 如果当前数字的各位数立方和等于其本身则认为它是水仙花数,并保存之
if sum(map(lambda n: n ** 3, bit_in_num)) == item:
result.append(item)
return result
if __name__ == '__main__':
print('该范围之内的水仙花数有', find_narcissistic_num(100, 999))
# 输出: 该范围之内的水仙花数有 [153, 370, 371, 407]
首先来看find_narcissistic_num()函数,带了默认参数,求解区间[100, 999]之间的水仙花数,参数支持调用者修改,但是后面的判断语句会对范围进行一个判断,不在规定范围就抛出异常。接下来定义了result变量,用于保存水仙花数,后面的循环从start到end,也就是遍历区间[start, end]中的每一个整数,循环体中取出当前数字的各位数字存入一个元组bit_in_num中,根据判断是否为水仙花数的规则对bit_in_num中的每一位数字求立方后再求和,符合规则就将该数字加入result列表,循环结束后就找到了指定范围内的所有水仙花数,返回它即可。