fazerse 发表于 2020-7-1 16:35:47

python 课后水仙花题,我按自己思路做,却报错

编写一个程序,求 100~999 之间的所有水仙花数。

    如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数

    for i in range(100, 1000):
      sum = 0
      temp = i
      while temp:
            sum = sum + (temp%10) ** 3
            temp //= 10         # 注意这里要使用地板除哦~
      if sum == i:
            print(i)

==========================================================================================================
老师的 解法甚为精妙,当时问过 算法解析, 现在又忘了。 (汗汗。。)然后我试着用原始的思路解题。也解出来了:
for i in range(100,1000):
   for a in range (1,10):
          for b in range (0,9):
               for c in range (0,9):
                  if i==(a**3+b**3+c**3)and i==(a*100+b*10+c):
                        print(i)
                        continue
---------------------------------------------------------------------------------------------------------------------
不过在我做的时候也碰到了不明白的点,比如 for后面的条件 ,不能用 and 加以并列,只能嵌套模式。然后我现在不太明白,如果 把 各个in后面的range[ ],直接 写成
,,    就无法运行,即使 写成
key=
for i in key:
   for a in key:
          for b in key:
               for c in key:
                  if i==(a**3+b**3+c**3)and i==(a*100+b*10+c):
                        print(i)
                        continue
就是即使前面先设好数组然后,让变量在数组中跑也不行, 记得课上讲, 一组[], 中间元素 用 ,隔开就可生成一个数组,为何 在 for后面不能直接用。

再一个问题就是,判定条件里, 如果把i==(a*100+b*10+c)   这部分去掉,电脑算的东西我就不知道是怎么得来的 想了半天没 算出跟电脑一致的答案。   盼高手解疑释惑。

qiuyouzhi 发表于 2020-7-1 16:38:10

range(0, 9) 是 0,1,2,3,4,5,6,7,8,
是0和9.
后面的同理。

Twilight6 发表于 2020-7-1 17:14:44

本帖最后由 Twilight6 于 2020-7-1 17:36 编辑




比如 for后面的条件 ,不能用 and 加以并列,只能嵌套模式。

是的哈,语法就是这样,我们学习每个编程语言,最重要的就是遵循语言的语法,没有这种用法,就没办法使用~

如果 把 各个in后面的range[ ],直接 写成
,,    就无法运行,即使 写成

range 是个生成整数对象容器的一个函数,函数调用时候都是用() 括号调用 而不是 [] 用中括号哈,中括号就是像楼上所说的 只有 0 和 9 这两个元素

for 循环是把 可迭代对象的元素一一遍历,所以只会遍历 0,和 9这两个元素,其他的同理

所以你要遍历一个范围就要用 range ,或者你列表为 这样才算 0~9 了哈哈,所以说还不如直接 range(9)

判定条件里, 如果把i==(a*100+b*10+c)   这部分去掉,电脑算的东西我就不知道是怎么得来的 想了半天没 算出跟电脑一致的答案。

去掉之后 打印的结果是    i==(a**3+b**3+c**3) 满足时候 i 的值,因为去掉 i==(a*100+b*10+c)   之后你的打印只有在条件 i==(a**3+b**3+c**3)满足时候才会打印

fazerse 发表于 2020-7-2 00:00:43

本帖最后由 fazerse 于 2020-7-2 00:18 编辑

Twilight6 发表于 2020-7-1 17:14
是的哈,语法就是这样,我们学习每个编程语言,最重要的就是遵循语言的语法,没有这种用法,就没 ...

改出来了,
key=range(100,1000)
num=range(10)
for i in key:
   for a in num:
          for b in num:
               for c in num:
                  if i==(a**3+b**3+c**3)and i==(a*100+b*10+c):
                        print(i)
                        continue
================================================
直接把DEbug 的 思路也给我了,其实只需要实现以下 , 就能看出问题了, 抱拳,抱拳。就是没明白, 电脑用i==(a**3+b**3+c**3)   怎么算出来的, 577, 603, 623,638,这些数, 还每个打印6次。   问题是577 !=(5**3+7**3+7**3)其他的那些也同理。

Twilight6 发表于 2020-7-2 00:05:35

fazerse 发表于 2020-7-2 00:00
改出来了,
key=range(100,1000)
num=range(9)





电脑是通过一直循环 三个for 每次来通过判断取到值 三次方后会不会等于 i 来计算出 水仙花数的

最外面循环执行时,要将内部循环全部执行完毕,才开始下次循环,所以说,你的代码效率很低的,就是因为每次外部循环都需要计算里面很多层的循环

无功 发表于 2020-7-3 14:20:19

Twilight6 发表于 2020-7-1 17:14
是的哈,语法就是这样,我们学习每个编程语言,最重要的就是遵循语言的语法,没有这种用法,就没 ...

感谢大佬
页: [1]
查看完整版本: python 课后水仙花题,我按自己思路做,却报错