鱼C论坛

 找回密码
 立即注册
查看: 1647|回复: 5

[已解决]python 课后水仙花题,我按自己思路做,却报错

[复制链接]
发表于 2020-7-1 16:35:47 | 显示全部楼层 |阅读模式

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

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

x
编写一个程序,求 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[ ],  直接 写成
[1,10],  [0,9], [0,9]   就无法运行,  即使 写成
key=[100,1000]
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)   这部分去掉,  电脑算的东西我就不知道是怎么得来的 想了半天没 算出跟电脑一致的答案。   盼高手解疑释惑。
最佳答案
2020-7-1 17:14:44
本帖最后由 Twilight6 于 2020-7-1 17:36 编辑




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


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

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


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

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

所以你要遍历一个范围就要用 range ,或者你列表为 [0,1,2,3,4,5,6,7,8,9] 这样才算 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)满足时候才会打印

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-1 16:38:10 | 显示全部楼层
range(0, 9) 是 0,1,2,3,4,5,6,7,8,
[0, 9]是0和9.
后面的同理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 17:14:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-1 17:36 编辑




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


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

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


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

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

所以你要遍历一个范围就要用 range ,或者你列表为 [0,1,2,3,4,5,6,7,8,9] 这样才算 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)满足时候才会打印

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

使用道具 举报

 楼主| 发表于 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 的 思路也给我了,  其实只需要实现以下 [0,9], 就能看出问题了, 抱拳,抱拳。  就是没明白, 电脑用  i==(a**3+b**3+c**3)   怎么算出来的, 577, 603, 623,  638,这些数, 还每个打印6次。   问题是577 !=(5**3+7**3+7**3)  其他的那些也同理。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-2 00:05:35 | 显示全部楼层
fazerse 发表于 2020-7-2 00:00
改出来了,
key=range(100,1000)
num=range(9)




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

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

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

使用道具 举报

发表于 2020-7-3 14:20:19 | 显示全部楼层
Twilight6 发表于 2020-7-1 17:14
是的哈,语法就是这样,我们学习每个编程语言,最重要的就是遵循语言的语法,没有这种用法,就没 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 14:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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