鱼C论坛

 找回密码
 立即注册
查看: 2760|回复: 4

[已解决]第009讲课后题

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

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

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

x
编写一个程序,求 100~999 之间的所有水仙花数。



如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数

01.for i in range(100, 1000):

02.    sum = 0

03.    temp = i

04.    while temp:

05.        sum = sum + (temp%10) ** 3

06.        temp //= 10         # 注意这里要使用地板除哦~

07.    if sum == i:

08.        print(i)

这个答案真没看懂,
最佳答案
2020-3-1 11:03:29
额 不是很清楚题主说的看不懂是什么意思。。。
是指的代码看不懂还是鱼哥传递的思想不是很懂。。。
我这里就都说一下叭
先说代码上:
1-3行:
就是一个for循环,i从100一直遍历到999
而 i 的 每一次遍历 都会在这个循环中 执行如下操作
一:将标志位sum设置为0
#实现代码:02
二:将 i 的值 传递给temp
#实现代码:03
三:进入内循环(就是在for循环中,再进入一个循环while)
#实现代码:04
接下来就是while循环实现的功能:
一:将temp(也就是我们现在判断的数字)的最后一位三次方 并且加到sum上
#实现代码:05
二:将temp减掉个位数,并且降低一位(例如 如果temp原来是321,那么就变成32,如果是32,就变成3,如果是3,那就变成0)
#实现代码:06

当while循环结束的时候   (# while循环的判断条件是temp ,也就是说 while循环结束 temp就等于0;而我们不能知道,当temp为0,那么temp的每一位的三次方 也就成功的加到了sum中)

我们要进入一个条件判断,也就是水仙花的条件判断
#实现代码:06、、07、08


******************************************************
一下为思路解释

就是首先我们要对100到999的每一个数进行遍历,也就是一次取出每一个数
每当我们取出一个数的时候,对于这一个数来说,我们要进行如下除了:
1、求它的各个数字立方和
2、判断各个数字的立方和是否等于它本身

要想是想 1 那么我们就必须对这个数字进行一下处理
一、把第三位的立方,加到sum中
二、把第二位的立方,加到sum中
三、把第一位的立方,加到sum中
而要完成这三步,我们又有如下思路:
每次,我们都是把最后一位的立方加到sum中(利用除10取余实现)
然后,我们再把这个数的最后一位减去,并且把它的第二位变成最后一位(利用底除实现,你看 每次我们用地板除,不就是把这个数除以10,并且只取整数部分嘛,那么原来的各位就变成的小数部分被抛弃,原来的十位就变成各位,百位变十位了)
而完成 2 就不用多说了 用if条件判断即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-1 10:31:19 | 显示全部楼层
1-3行,基本的,不多说
第4-6行,只要temp != 0就继续循环,因为
后面有个temp //= 10
第5行(重点),sum加上每一位的立方
可以这么试试:
153 //= 10
153 % 10
然后看看结果
7-8行,如果符合条件,就输出这个数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 10:50:52 | 显示全部楼层
另一个方法:
for a in range(1,10):
    for b in range(0,10):
        for c in range(0,10):
            if a*100+b*10+c == a**3+b**3+c**3:
                print(a*100+b*10+c)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-1 10:52:10 | 显示全部楼层
  1.     假设 i = 578
  2.     sum = 0
  3.     temp = i =  578
  4.     这里进入 while temp 循环
  5.         【第1次循环】:
  6.         sum = sum + (temp % 10) = 0 + (578 % 10) ** 3 = 8 ** 3
  7.         temp = temp // 10 = 578 // 10 = 57
  8.         【第2次循环】:
  9.         sum = sum + (temp % 10) = 8 ** 3 + (57 % 10) ** 3 = 8 ** 3 + 7 ** 3
  10.         temp = temp // 10 = 57 // 10 = 5
  11.         【第3次循环】:
  12.         sum = sum + (temp % 10) = 8 ** 3 +7 ** 3 +  (5 % 10) ** 3 = 8 ** 3 + 7 ** 3 + 5 ** 3
  13.         temp = temp // 10 = 5 // 10 = 0

  14.         至此,while temp 循环因 temp = 0 而终止,这时,sum =  8 ** 3 + 7 ** 3 + 5 ** 3
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 11:03:29 | 显示全部楼层    本楼为最佳答案   
额 不是很清楚题主说的看不懂是什么意思。。。
是指的代码看不懂还是鱼哥传递的思想不是很懂。。。
我这里就都说一下叭
先说代码上:
1-3行:
就是一个for循环,i从100一直遍历到999
而 i 的 每一次遍历 都会在这个循环中 执行如下操作
一:将标志位sum设置为0
#实现代码:02
二:将 i 的值 传递给temp
#实现代码:03
三:进入内循环(就是在for循环中,再进入一个循环while)
#实现代码:04
接下来就是while循环实现的功能:
一:将temp(也就是我们现在判断的数字)的最后一位三次方 并且加到sum上
#实现代码:05
二:将temp减掉个位数,并且降低一位(例如 如果temp原来是321,那么就变成32,如果是32,就变成3,如果是3,那就变成0)
#实现代码:06

当while循环结束的时候   (# while循环的判断条件是temp ,也就是说 while循环结束 temp就等于0;而我们不能知道,当temp为0,那么temp的每一位的三次方 也就成功的加到了sum中)

我们要进入一个条件判断,也就是水仙花的条件判断
#实现代码:06、、07、08


******************************************************
一下为思路解释

就是首先我们要对100到999的每一个数进行遍历,也就是一次取出每一个数
每当我们取出一个数的时候,对于这一个数来说,我们要进行如下除了:
1、求它的各个数字立方和
2、判断各个数字的立方和是否等于它本身

要想是想 1 那么我们就必须对这个数字进行一下处理
一、把第三位的立方,加到sum中
二、把第二位的立方,加到sum中
三、把第一位的立方,加到sum中
而要完成这三步,我们又有如下思路:
每次,我们都是把最后一位的立方加到sum中(利用除10取余实现)
然后,我们再把这个数的最后一位减去,并且把它的第二位变成最后一位(利用底除实现,你看 每次我们用地板除,不就是把这个数除以10,并且只取整数部分嘛,那么原来的各位就变成的小数部分被抛弃,原来的十位就变成各位,百位变十位了)
而完成 2 就不用多说了 用if条件判断即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 16:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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