鱼C论坛

 找回密码
 立即注册
查看: 2410|回复: 13

[学习笔记] P19 018函数:灵活即强大 课后题 动动手1.寻找水仙花数 学习笔记

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

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

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

x
题目--
1. 寻找水仙花数
题目要求:如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 1^3+5^3+3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。

最开始只想到了通过循环的方法,一点儿都没想到如何使用函数...
下述代码是我到现在为止的做出来的,通过注释可以看到我踩了自己挖的多少坑。
出bug就测试、缩小循环范围、加入print语句来看到代码运行中各变量的值...

  1. # 153 = 1*3 + 5*3 + 3*3
  2. # 153 // 10 = 15, % 3
  3. # 15  // 10 = 1 , % 5
  4. # 1   // 10 = 0,  % 1
  5. #上述内容可以通过循环实现, 把商设为变量shang,while shang: 可以实现循环和控制循环终止
  6. #beichu = shang, 可以实现下次循环时,被除数变成本次循环的shang

  7. #思考如何把每次的余数*3求和,得到一个值和初始值比较, 可以使用+=的方法

  8. #大循环规定了范围, 三位数,那么大循环范围为100-999, 例如for i in range(100,1000)

  9. #需预先设定的变量有,  每次循环中的商shang,每次循环中的余数yu, 余数的和he

  10. yu = 0


  11. #循环范围小一些测试循环
  12. for i in range(152, 155):
  13.     print('当前i值为', i) #使用print来检查代码
  14.     #对每个三位数求出个位、十位、百位乘以3的和
  15.     each = i  #保留i这个变量方便后续if比较
  16.     shang = 1 #放在循环里是为了第二次循环开始时,把变量shang值从0改回1,目的是为了第二次循环能正常开始
  17.     he = 0 #放在循环里是为了第二次循环开始时,把变量he值回归零,避免累加上一次循环的he值
  18.     while shang: #控制当商为0时结束循环
  19.         shang = each // 10
  20.         print('    此时shang值为', shang)
  21.         yu = each % 10
  22.         print('    此时yu值为', yu)
  23.         each = shang #使本轮循环的商作为下轮循环的被除数
  24.         he += yu ** 3
  25.         print('    当前he值为', he) #使用print来检查代码
  26.         print()

  27.     #判断哪些数符合条件,打印
  28.     if he == i:
  29.         print(i, '是水仙花数')
  30.     else:
  31.         print(i, '不是水仙花数')
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-1-10 17:53:14 | 显示全部楼层
通过循环的方法(脑中还是没有建立函数的概念2333)得出有效代码如下,还未和标准答案核对:
  1. yu = 0
  2. for i in range(100, 1000):
  3.    
  4.     #对每个三位数求出个位、十位、百位乘以3的和
  5.     each = i  #保留i这个变量方便后续if比较
  6.     shang = 1 #放在循环里是为了第二次循环开始时,把变量shang值从0改回1,目的是为了第二次循环能正常开始
  7.     he = 0 #放在循环里是为了第二次循环开始时,把变量he值回归零,避免累加上一次循环的he值
  8.     while shang: #控制当商为0时结束循环
  9.         shang = each // 10
  10.         yu = each % 10
  11.         each = shang #使本轮循环的商作为下轮循环的被除数
  12.         he += yu ** 3
  13.         
  14.     #判断哪些数符合条件,打印
  15.     if he == i:
  16.         print(i, '是水仙花数')
复制代码


按F5运行后 IDLE交互界面显示的结果为:
153 是水仙花数
370 是水仙花数
371 是水仙花数
407 是水仙花数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-10 17:57:36 | 显示全部楼层
本帖最后由 jackz007 于 2020-1-10 17:58 编辑
WilsonWolf2333 发表于 2020-1-10 17:53
通过循环的方法(脑中还是没有建立函数的概念2333)得出有效代码如下,还未和标准答案核对:


     代码过于繁琐了吧,楼主
  1. for i in range(100, 1000):
  2.     x , sum = i , 0
  3.     while x:
  4.         sum +=(x % 10) ** 3
  5.         x //= 10
  6.     if sum == i:
  7.         print(i , '是水仙花数')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-10 18:00:35 | 显示全部楼层
试着写了函数,测试,好像成了:
  1. def lifanghe(x):
  2.     y = 0
  3.     each = x
  4.     shang = 1
  5.     he = 0
  6.     while shang:
  7.         shang = each // 10
  8.         yu = each % 10
  9.         each = shang
  10.         he += yu ** 3
  11.     return he
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-10 18:04:37 | 显示全部楼层
加入for循环,好像也成了:
  1. def lifanghe(x):
  2.     y = 0
  3.     each = x
  4.     shang = 1
  5.     he = 0
  6.     while shang:
  7.         shang = each // 10
  8.         yu = each % 10
  9.         each = shang
  10.         he += yu ** 3
  11.     return he

  12. for x in range(100, 1000):
  13.     if lifanghe(x) == x:
  14.         print(x, '是水仙花数')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-10 18:05:29 | 显示全部楼层
回头核对代码,再复盘这道题。周末愉快!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-10 18:09:03 | 显示全部楼层
jackz007 发表于 2020-1-10 17:57
代码过于繁琐了吧,楼主

是的,我写的太太太繁琐了...
谢谢回复! 你这代码这么简洁!厉害啊
这就是负基础小白白白和老手的差距吧...
周末愉快!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-10 18:13:23 | 显示全部楼层
WilsonWolf2333 发表于 2020-1-10 18:09
是的,我写的太太太繁琐了...
谢谢回复! 你这代码这么简洁!厉害啊
这就是负基础小白白白和老手的差距 ...

     大家互相学习,共同提高,祝周末愉快!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-15 17:41:30 | 显示全部楼层
核对标准答案遇到了问题,我手敲的代码 和 直接网页上点复制代码,运行的结果不一样...
这个是网页点复制后粘贴的代码:
  1. def Narcissus():
  2.     for each in range(100, 1000):
  3.         temp = each
  4.         sum = 0
  5.         while temp:
  6.             sum = sum + (temp%10) ** 3
  7.             temp = temp // 10  # 注意这里用地板除

  8.         if sum == each:
  9.             print(each, end='\t')

  10. print("所有的水仙花数分别是:", end='')
  11. Narcissus()
复制代码


下方的是我自己看着答案手敲的代码:
  1. def Narcissus():
  2.     for each in range(100, 1000):
  3.         temp = each
  4.         sum = 0
  5.         while temp:
  6.             sum = sum + (temp%10) ** 3
  7.             temp = temp // 10 #注意这里用地板除

  8.         if sum == each:
  9.             print(each, end = '\t')

  10. print('所有水仙花数分别是:', end = '')
  11. Narcissus()
复制代码


运行结果的区别如下:
======= RESTART: C:\Users\aaaaa\bbbbb\Python\Code\daily script.py =======
所有的水仙花数分别是:153        370        371        407       
>>>
======= RESTART: C:\Users\aaaaa\bbbbb\Python\Code\daily script.py =======
所有水仙花数分别是:153 370        371        407
只有第一个和第二个结果中间,没有Tab,太奇怪了。。。正在想。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-15 17:50:50 | 显示全部楼层
手动敲第二遍就没问题了。。。仍然在想。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 14:54:22 | 显示全部楼层
已发了求助帖,想不明白了...等有大神解惑后,再完善这个帖子。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 15:15:30 | 显示全部楼层
以下是我对标准答案加的注释,方便自己理解:
  1. def Narcissus():
  2.     for each in range(100, 1000): #历遍从100 到 999的所有三位数字
  3.         temp = each #新建一个temp变量,方便做除法
  4.         sum = 0  #把各个位数**3的和单独设置变量,目的是为了和each作比较
  5.         while temp: #开始循环,也定义循环终止的时刻
  6.             sum = sum + (temp%10) ** 3
  7.             temp = temp // 10  # 例如153 // 10变成15,下次循环时15作为取余数的被除数

  8.         if sum == each:
  9.             print(each, end='\t')

  10. print("所有的水仙花数分别是:", end='')
  11. Narcissus()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-19 14:41:44 | 显示全部楼层
咨询帖了有大神回复了,而且自己花很多时间上网查了资料,大概给自己解释通了..
等待咨询帖关帖,再更新这个帖子。
To be continued...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-19 17:37:39 | 显示全部楼层
3.自己重新默敲一遍代码,完成
4.回头看自己的代码。。。hmmmm
1)多定义了好多变量, 3#大神 @jackz007的代码就简洁很多
2)使用了return的语句,目的是运行函数后返回值。。这个方法有点尴尬啊
3)缺少历练,手生啊...

这道题也算过去了。下一课走起~
P.S.我回复这层楼前,改了头像了,不知道会不会显示出我新头像啊 哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 10:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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