本题要求编写程序,计算所有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`。