鱼C论坛

 找回密码
 立即注册
查看: 947|回复: 14

[已解决]求大家帮忙看看我的代码哪里出了问题

[复制链接]
发表于 2020-4-30 02:10:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于水仙花数的课后题,我的代码如下:
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 22:10:27
秋膘已贴好 发表于 2020-4-30 22:09
我又简化了一下我的代码
for i in range(100, 1000):
    sum = (i % 10) ** 3 + ((i // 10) % 10) * ...

因为原答案中对 i 做了修改,如果不对 i 做一个备份那么判断就会出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-30 02:13:51 | 显示全部楼层
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的

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

我整个人像白痴一样 好悲伤
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-30 07:25:54 | 显示全部楼层
秋膘已贴好 发表于 2020-4-30 02:13
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的

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

当满足while后面的条件时,进入循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-30 08:12:36 | 显示全部楼层
秋膘已贴好 发表于 2020-4-30 02:13
对不起 我再加一句 我删了while循环 运行起来了 而且达到目的

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

你这个while没有退出循环的条件,结果是有进无出死循环。
while循环的特性是可以无限循环,可以设立进入循环和退出的条件;for循环一般用于迭代或者循环次数明确的循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 这一条语句。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 22:05:53 | 显示全部楼层
txxcat 发表于 2020-4-30 08:12
你这个while没有退出循环的条件,结果是有进无出死循环。
while循环的特性是可以无限循环,可以设立进入 ...

我的理解是:参考答案中的那个循环while temp好像也没有退出循环的条件, 是for i in range给了i也就是后边的temp范围……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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引入了……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 做一个备份那么判断就会出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

循环体里有:temp //= 10,这个最后temp的值为0,while 0,就退出循环了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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来判断最终要取的水仙花数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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来判断最终要取的水仙花数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

基本是对的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 22:40:28 | 显示全部楼层

谢谢您!我真的是茶饭不思想这个题,原答案的思路真的打死我 我都想不出来的。在您的帮助下我好歹能看懂原答案了。谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 00:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表