【算法设计与分析】Python寻找100~999以内的水仙花数

水仙花数指的是在区间[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列表,循环结束后就找到了指定范围内的所有水仙花数,返回它即可。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值