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) 这部分去掉,电脑算的东西我就不知道是怎么得来的 想了半天没 算出跟电脑一致的答案。 盼高手解疑释惑。 range(0, 9) 是 0,1,2,3,4,5,6,7,8,
是0和9.
后面的同理。 本帖最后由 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: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)其他的那些也同理。 fazerse 发表于 2020-7-2 00:00
改出来了,
key=range(100,1000)
num=range(9)
电脑是通过一直循环 三个for 每次来通过判断取到值 三次方后会不会等于 i 来计算出 水仙花数的
最外面循环执行时,要将内部循环全部执行完毕,才开始下次循环,所以说,你的代码效率很低的,就是因为每次外部循环都需要计算里面很多层的循环
Twilight6 发表于 2020-7-1 17:14
是的哈,语法就是这样,我们学习每个编程语言,最重要的就是遵循语言的语法,没有这种用法,就没 ...
感谢大佬
页:
[1]