davidmou 发表于 2023-7-8 00:15:38

过来看看水仙花拉@--@

# 1. 编写一个程序,求 100~999 之间的所有水仙花数。
   
# 如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数。
for i in range(100,1000):
    for a in range(1,10):
      for b in range(10):
            for c in range(10):
                if i == a * 100 + b * 10 + c * 1 and i == a ** 3 + b ** 3 + c ** 3:
                  print(i)
大佬们觉得这答题还有什么别的方案

歌者文明清理员 发表于 2023-7-8 00:18:59

本帖最后由 歌者文明清理员 于 2023-7-8 00:22 编辑

你可以枚举数字
然后把数字按照数位拆开
并且如果你已经有百位十位个位的话
就没必要枚举整个数字了

解法2
for i in range(100,1000):
    a, b, c = str(i) # 字符串可以被拆分
    if i == (a ** 3 + b ** 3 + c ** 3):
      print(i)

解法3


for a in range(1, 10):
    for b in range(10):
      for c in range(10):
            if (a * 100 + b * 10 + c) == a ** 3 + b ** 3 + c ** 3:
                print(i)

isdkz 发表于 2023-7-8 06:15:53

你的方案已经可以找出所有的水仙花数,但它的效率不是最优的。在你的方案中,你遍历了每个三位数的每一位,并判断这个数是否满足水仙花数的条件。然而,对于每一个数i,其实只需要计算一次各个位数的立方和就可以了,这样可以节省计算量。

下面是一个更加高效的方案:

for i in range(100,1000):
    a = i // 100# 百位数
    b = i // 10 % 10# 十位数
    c = i % 10# 个位数
    if i == a3 + b3 + c**3:
      print(i)

在这个版本中,我们直接使用了数字的整除和取模运算来提取出一个三位数的每一位,这样我们就可以直接计算每一位的立方和,然后判断这个数是否满足水仙花数的条件。这个方案更简洁,同时也更高效。

ww185912 发表于 2023-7-8 09:25:59

我用的列表推导式来做的,但是有局限性
i_list = )**3+int(str(i))**3+int(str(i))**3)]
print(i_list)
页: [1]
查看完整版本: 过来看看水仙花拉@--@