秋膘已贴好 发表于 2020-4-30 02:10:00

求大家帮忙看看我的代码哪里出了问题

关于水仙花数的课后题,我的代码如下:
for i in range(100, 1000):
    temp = i
    while temp:
      sum = (temp % 10) ** 3 + ((temp // 10) % 10) ** 3 + (temp // 100) ** 3
    if sum == i:
      print(i)

但是运行不起来。我想知道具体是哪里错了

秋膘已贴好 发表于 2020-4-30 02:13:51

对不起 我再加一句 我删了while循环 运行起来了 而且达到目的

所以问题改为 啥时候用while……

我整个人像白痴一样 好悲伤

老八秘制 发表于 2020-4-30 07:25:54

秋膘已贴好 发表于 2020-4-30 02:13
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的

所以问题改为 啥时候用while……


当满足while后面的条件时,进入循环

txxcat 发表于 2020-4-30 08:12:36

秋膘已贴好 发表于 2020-4-30 02:13
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的

所以问题改为 啥时候用while……


你这个while没有退出循环的条件,结果是有进无出死循环。
while循环的特性是可以无限循环,可以设立进入循环和退出的条件;for循环一般用于迭代或者循环次数明确的循环。

zltzlt 发表于 2020-4-30 13:09:45

秋膘已贴好 发表于 2020-4-30 02:13
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的

所以问题改为 啥时候用while……


如果循环次数已知那么可以用 for 循环,如果循环次数未知可以用 while 循环。

在你的代码中完全没有必要加 while 循环,因为没必要重复执行 sum = (temp % 10) ** 3 + ((temp // 10) % 10) ** 3 + (temp // 100) ** 3 这一条语句。

秋膘已贴好 发表于 2020-4-30 22:05:53

txxcat 发表于 2020-4-30 08:12
你这个while没有退出循环的条件,结果是有进无出死循环。
while循环的特性是可以无限循环,可以设立进入 ...

我的理解是:参考答案中的那个循环while temp好像也没有退出循环的条件, 是for i in range给了i也就是后边的temp范围……

秋膘已贴好 发表于 2020-4-30 22:09:32

zltzlt 发表于 2020-4-30 13:09
如果循环次数已知那么可以用 for 循环,如果循环次数未知可以用 while 循环。

在你的代码中完全没有必 ...


我又简化了一下我的代码
for i in range(100, 1000):
    sum = (i % 10) ** 3 + ((i // 10) % 10) ** 3 + (i// 100) ** 3
    if sum == i:
      print(i)
这样也是可以运行出正确结果的,那么看来在我的代码里完全不需要建立一个新的变量temp。
我更不明白原答案while循环为什么要把temp引入了……

zltzlt 发表于 2020-4-30 22:10:27

秋膘已贴好 发表于 2020-4-30 22:09
我又简化了一下我的代码
for i in range(100, 1000):
    sum = (i % 10) ** 3 + ((i // 10) % 10) * ...

因为原答案中对 i 做了修改,如果不对 i 做一个备份那么判断就会出错

txxcat 发表于 2020-4-30 22:27:25

秋膘已贴好 发表于 2020-4-30 22:05
我的理解是:参考答案中的那个循环while temp好像也没有退出循环的条件, 是for i in range给了i也就是后 ...

循环体里有:temp //= 10,这个最后temp的值为0,while 0,就退出循环了。

秋膘已贴好 发表于 2020-4-30 22:36:37

zltzlt 发表于 2020-4-30 22:10
因为原答案中对 i 做了修改,如果不对 i 做一个备份那么判断就会出错

那我这样理解对吗?
1.我的代码是用i这个有定义域的未知数进行本身的拆分以确定各个数位的值,再立方求和。从进入程序确定i值开始每一次的单次循环中i值没有改变,所以不需要做任何赋值或是引入其他变量。
2.原答案中,i值是在for循环也就是该值得定义域中确定的,那么在求sum的过程中,用while循环进行数字的降级(三位数降两位数确定个位,两位数降一位数确定十位,最后剩下的就是百位数。temp//=10实际上是确保已经完成了降级的操作,所以分解完该三位数,求和,就可以退出while循环了)然后在for循环中每次i被确定一个值,就进入while循环进行降级求和。最后是sum=i来判断最终要取的水仙花数。

秋膘已贴好 发表于 2020-4-30 22:37:45

txxcat 发表于 2020-4-30 22:27
循环体里有:temp //= 10,这个最后temp的值为0,while 0,就退出循环了。

我感觉我明白一点了 我结合了楼上的解释 自己理解了一下。可以麻烦您帮我看看理解得有什么问题吗?

我的理解:
1.我的代码是用i这个有定义域的未知数进行本身的拆分以确定各个数位的值,再立方求和。从进入程序确定i值开始每一次的单次循环中i值没有改变,所以不需要做任何赋值或是引入其他变量。
2.原答案中,i值是在for循环也就是该值得定义域中确定的,那么在求sum的过程中,用while循环进行数字的降级(三位数降两位数确定个位,两位数降一位数确定十位,最后剩下的就是百位数。temp//=10实际上是确保已经完成了降级的操作,所以分解完该三位数,求和,就可以退出while循环了)然后在for循环中每次i被确定一个值,就进入while循环进行降级求和。最后是sum=i来判断最终要取的水仙花数。

zltzlt 发表于 2020-4-30 22:38:38

秋膘已贴好 发表于 2020-4-30 22:36
那我这样理解对吗?
1.我的代码是用i这个有定义域的未知数进行本身的拆分以确定各个数位的值,再立方求 ...

基本是对的。

秋膘已贴好 发表于 2020-4-30 22:40:28

zltzlt 发表于 2020-4-30 22:38
基本是对的。

谢谢您!我真的是茶饭不思想这个题,原答案的思路真的打死我 我都想不出来的。在您的帮助下我好歹能看懂原答案了。谢谢!

zltzlt 发表于 2020-4-30 22:44:51

秋膘已贴好 发表于 2020-4-30 22:40
谢谢您!我真的是茶饭不思想这个题,原答案的思路真的打死我 我都想不出来的。在您的帮助下我好歹能看懂 ...

问题已解决就设置一个回复为最佳答案吧,让别人知道这个问题已解决。

txxcat 发表于 2020-5-1 00:06:15

秋膘已贴好 发表于 2020-4-30 22:36
那我这样理解对吗?
1.我的代码是用i这个有定义域的未知数进行本身的拆分以确定各个数位的值,再立方求 ...

是的
页: [1]
查看完整版本: 求大家帮忙看看我的代码哪里出了问题