鱼C论坛

 找回密码
 立即注册
查看: 2070|回复: 11

[已解决]python老版009讲动动手第一题 水仙数那题

[复制链接]
发表于 2020-2-21 20:32:18 | 显示全部楼层 |阅读模式

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

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

x
  1. n = 100
  2. m = n % 100
  3. x = m % 10
  4. y = x % 1
  5. while n <= 1000:
  6.     if x*x*x + y*y*y + m*m*m == n:
  7.         print (n,end=" ")
  8.     else:
  9.         n += 1

  10.         
复制代码
请问这个代码输出为什么没有结果,小甲鱼的我理解了,但是我的我看不太出来错误是什么,虽然真的写得好烂好多参数·····

最佳答案
2020-2-21 21:33:09
你这个:
首先,while 后面 n 初始为100,不可能大于1000,就不可能开始循环
其次,% 代表取余数,比如 52 / 10 = 5 余 2,所以 52 % 10 = 2,所以你的 m 取得其实是十位和个位
再次,// 代表取整,比如 52 / 10 = 5 余 2,所以 52 // 10 = 5,所以你的 n 在经过 n // 100 以后已经是百位数了,在取余就是零了
最后,除了 else 后面要加 n += 1 外,if 后面也要加,因为 if 的程序走完以后就从头开始了,不走 else,所以如果不加 n += 1 ,n 就一直是100,就会无限循环
但是写两次 n += 1 会显得很多余,所以你可以把  n += 1 与 if 对齐,不放在 if 里面,这样程序走完 if 以后就会走  n += 1 ,n就变成 101 然后慢慢变大了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-21 20:33:52 | 显示全部楼层
如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数。这是题目背景,要求打印出所有100·~1000间的水仙花数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 20:43:08 | 显示全部楼层
前四行应该放在循环里面,这个过程是while循环的一部分,每一个n都要执行这几行代码
如果在外面,循环外的n一直都是100,那么m,x,y,也就一直是同一个值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 20:49:52 | 显示全部楼层
第五空 发表于 2020-2-21 20:43
前四行应该放在循环里面,这个过程是while循环的一部分,每一个n都要执行这几行代码
如果在外面,循环外的 ...

可是这样的话while的条件里我用到了n,如果n在循环内的话,就没法定义条件里的n了,执行时候会报错。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 20:59:29 | 显示全部楼层
  1. n = 100
  2. while n >= 1000:
  3.     m = n % 100
  4.     x = n // 10 % 10
  5.     y = n // 100 % 1
  6.     if x*x*x + y*y*y + m*m*m == n:
  7.         print (n,end=" ")
  8.     else:
  9.         n += 1
  10.         continue
复制代码

我改进了一下,但执行仍然没有结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 21:19:39 | 显示全部楼层
你debug一下就知道了,你m要是想取数字的个位的话,你对n直接模100显然是不对的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 21:33:09 | 显示全部楼层    本楼为最佳答案   
你这个:
首先,while 后面 n 初始为100,不可能大于1000,就不可能开始循环
其次,% 代表取余数,比如 52 / 10 = 5 余 2,所以 52 % 10 = 2,所以你的 m 取得其实是十位和个位
再次,// 代表取整,比如 52 / 10 = 5 余 2,所以 52 // 10 = 5,所以你的 n 在经过 n // 100 以后已经是百位数了,在取余就是零了
最后,除了 else 后面要加 n += 1 外,if 后面也要加,因为 if 的程序走完以后就从头开始了,不走 else,所以如果不加 n += 1 ,n 就一直是100,就会无限循环
但是写两次 n += 1 会显得很多余,所以你可以把  n += 1 与 if 对齐,不放在 if 里面,这样程序走完 if 以后就会走  n += 1 ,n就变成 101 然后慢慢变大了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-21 21:34:42 | 显示全部楼层
  1. n = 100
  2. while n < 1000:
  3.     百位 = n // 100
  4.     十位 = (n % 100) // 10
  5.     个位 = n % 10
  6.     if 百位**3 + 十位**3 + 个位**3 == n:
  7.         print (n)
  8.     n += 1
复制代码


这个是我改完以后的,应该是对的
另外,else 如果啥都没有,个人感觉不写也行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 21:39:13 | 显示全部楼层
我感觉用 for in  range 循环比较好吧,反正水仙花数是三位数。
  1. #求水仙花数
  2. for n in range(100, 1000):  #水仙花数是三位数
  3.     x = n // 100        # 百位数
  4.     y = n % 100 // 10   # 十位数
  5.     z = n % 10          # 个位数
  6.     if n == x ** 3 + y ** 3 + z ** 3:  #根据水仙花数的要求判断
  7.         print('水仙花数:{}'.format(n))  #输出水仙花数(共四个)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-22 00:54:21 | 显示全部楼层
我这个方法更简便
  1. x=100
  2. while x<=1000:
  3.    if sum([int(i)**3 for i in list(str(x))])==x:
  4.        print(x)
  5.    x+=1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-22 08:46:48 | 显示全部楼层
第五空 发表于 2020-2-21 21:33
你这个:
首先,while 后面 n 初始为100,不可能大于1000,就不可能开始循环
其次,% 代表取余数,比如 5 ...

感谢!我去修改一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-22 08:50:59 | 显示全部楼层
ouyunfu 发表于 2020-2-22 00:54
我这个方法更简便

list我还没学到,等学会再来看看,谢谢你
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-2 13:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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