求大家帮忙看看我的代码哪里出了问题
关于水仙花数的课后题,我的代码如下: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)
但是运行不起来。我想知道具体是哪里错了
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的
所以问题改为 啥时候用while……
我整个人像白痴一样 好悲伤 秋膘已贴好 发表于 2020-4-30 02:13
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的
所以问题改为 啥时候用while……
当满足while后面的条件时,进入循环 秋膘已贴好 发表于 2020-4-30 02:13
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的
所以问题改为 啥时候用while……
你这个while没有退出循环的条件,结果是有进无出死循环。
while循环的特性是可以无限循环,可以设立进入循环和退出的条件;for循环一般用于迭代或者循环次数明确的循环。 秋膘已贴好 发表于 2020-4-30 02:13
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的
所以问题改为 啥时候用while……
如果循环次数已知那么可以用 for 循环,如果循环次数未知可以用 while 循环。
在你的代码中完全没有必要加 while 循环,因为没必要重复执行 sum = (temp % 10) ** 3 + ((temp // 10) % 10) ** 3 + (temp // 100) ** 3 这一条语句。 txxcat 发表于 2020-4-30 08:12
你这个while没有退出循环的条件,结果是有进无出死循环。
while循环的特性是可以无限循环,可以设立进入 ...
我的理解是:参考答案中的那个循环while temp好像也没有退出循环的条件, 是for i in range给了i也就是后边的temp范围…… 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引入了…… 秋膘已贴好 发表于 2020-4-30 22:09
我又简化了一下我的代码
for i in range(100, 1000):
sum = (i % 10) ** 3 + ((i // 10) % 10) * ...
因为原答案中对 i 做了修改,如果不对 i 做一个备份那么判断就会出错 秋膘已贴好 发表于 2020-4-30 22:05
我的理解是:参考答案中的那个循环while temp好像也没有退出循环的条件, 是for i in range给了i也就是后 ...
循环体里有:temp //= 10,这个最后temp的值为0,while 0,就退出循环了。 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来判断最终要取的水仙花数。 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来判断最终要取的水仙花数。 秋膘已贴好 发表于 2020-4-30 22:36
那我这样理解对吗?
1.我的代码是用i这个有定义域的未知数进行本身的拆分以确定各个数位的值,再立方求 ...
基本是对的。 zltzlt 发表于 2020-4-30 22:38
基本是对的。
谢谢您!我真的是茶饭不思想这个题,原答案的思路真的打死我 我都想不出来的。在您的帮助下我好歹能看懂原答案了。谢谢! 秋膘已贴好 发表于 2020-4-30 22:40
谢谢您!我真的是茶饭不思想这个题,原答案的思路真的打死我 我都想不出来的。在您的帮助下我好歹能看懂 ...
问题已解决就设置一个回复为最佳答案吧,让别人知道这个问题已解决。
秋膘已贴好 发表于 2020-4-30 22:36
那我这样理解对吗?
1.我的代码是用i这个有定义域的未知数进行本身的拆分以确定各个数位的值,再立方求 ...
是的
页:
[1]