水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。

 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤5)

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

代码如下:

N = int(input())


# 计算N位水仙花数的上下界
lower_bound = 10 ** (N - 1)
upper_bound = 10 ** N


# 遍历上下界之间的数,判断是否是N位水仙花数
for num in range(lower_bound, upper_bound):
    n = num
    total = 0
    
    while n > 0:
        x = n % 10
        total += x ** N
        n = n//10   #n //= 10 表示将变量 n 的值除以 10 并将结果赋给 n。这实际上是将 n 除以 10 并将结果更新到 n 变量中,以处理下一位的数字。
    if total == num:
        print(num)

考虑一个N位水仙花数,它的最小值为10^(N-1)(比如3位水仙花数的最小值是100,4位水仙花数的最小值是1000,以此类推)。这是因为一个N位水仙花数的最高位数字不会是0,所以最小值的最高位是1,其余位可以是0。

类似地,N位水仙花数的最大值为10^N - 1(比如3位水仙花数的最大值是999,4位水仙花数的最大值是9999,以此类推)。这是因为每一位都可以是9,所以最大值为10^N - 1。

因此,计算上下界后,只需要在这个范围内遍历数字,就能有效地找到所有N位水仙花数,而不必遍历整个数字范围,节省了计算时间。这样的范围限制是一种优化,可以提高算法的效率。

这两行代码用于分解一个数字 `n` 的各个位数,然后计算这些位数的 N 次幂之和。

x = n % 10
total += x ** N

1. `digit = n % 10`: 这一行代码使用模运算符 `%` 来获取 `n` 的最后一位数字,也就是它的个位数字。模运算返回除法的余数,因此 `n % 10` 取得 `n` 除以 10 的余数,这样可以得到最后一位数字。例如,如果 `n` 是 123,那么 `n % 10` 将得到 3。

2. `total += digit ** N`: 这一行代码将 `digit` 的 N 次幂加到 `total` 变量上。这是因为水仙花数的定义是:一个 N 位数的每个位上的数字的 N 次幂之和等于它本身。所以,对于每一位数字,我们将其 N 次幂加到 `total` 变量上,以便最后比较 `total` 是否等于原始的数字 `n`。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值