鱼C论坛

 找回密码
 立即注册
查看: 1230|回复: 17

[已解决]第009讲课后作业

[复制链接]
发表于 2019-1-29 23:21:54 | 显示全部楼层 |阅读模式

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

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

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)

以上是正确答案,我没有看懂,个人的解题思路是,将一个数字中的个位、十位和百位拿出来,然后分别开3次方,加起来后和原先数字相等的,就能拿出来了,以下是我写的代码,可是执行起来一直是空,不知道为什么,还请各位大师求解
for i in range(100,1000):
    b = int(i/100)
    c = int((i-b*100)/10)
    d = int(i%10)
    if i == b^3 + c^3 + d^3:
        print(i)

最佳答案
2019-1-30 09:16:01
代码第一行:for 循环启动,从100-999迭代赋值给变量 i
       第二行:定义变量 sum = 0 #用于计算立方和
                    定义变量 temp = i # 把 for 循环当前迭代值赋值给 temp 我们假设现在 i = 153,那么temp也指向153
       第四行:启动while 循环 判断条件是 temp 归零时停止循环
       第五行:进入循环体
                    sum = sum + (temp%10)** 3 # 前面我们假设temp = 153,那么153与10取余 = 3,3的立方=27,sum 此时 =27;
                    接着 temp  //= 10 # 将 153地板除,现在temp = 15啦
       重新判断循环条件,temp = 15 ,不为零再次进入循环体
                    sum = sum +(temp%10)**3 # 此时sum = 27 + 125 = 152啦   
                    temp //= 10以后 temp = 1
       再次判断循环条件,temp= 1 ,再次进入循环体
                    sum = sum +(temp%10)**3 #此时sum = 27 + 125 + 1 = 153
                    temp //= 10 # temp 归零
推出循环

       如果 sum = i # 现在正好相等
       所以打印 i
                    
                    
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-29 23:24:44 | 显示全部楼层

问题1:
是// 不是 / # 注意这里要使用地板除哦~

问题2:
b**3 不是 b^3
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-29 23:25:48 | 显示全部楼层
正确答案这么明显了,不知道你为什么会觉得^是幂运算。 还有 /
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-29 23:27:26 | 显示全部楼层
问题3
i == b^3 + c^3 + d^3
不应该是:
i == () 吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-29 23:27:45 | 显示全部楼层
ba21 发表于 2019-1-29 23:24
问题1:
是// 不是 / # 注意这里要使用地板除哦~

/ 他加了int,没有错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-29 23:38:21 | 显示全部楼层
ba21 发表于 2019-1-29 23:24
问题1:
是// 不是 / # 注意这里要使用地板除哦~

我自己的代码里面,把^当成是幂运算了,实际上是**,改了代码后就实现了,没有问题,但是小甲鱼写得标准答案自己没有理解;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-29 23:39:06 | 显示全部楼层
xy123151 发表于 2019-1-29 23:27
/ 他加了int,没有错


小甲鱼写得标准答案,我没看懂,我感觉还是我的代码比较好理解;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-29 23:41:52 | 显示全部楼层
本帖最后由 jackz007 于 2019-1-29 23:48 编辑
  1. #!/bin/python
  2. #coding:gbk

  3. for i in range(100 , 1000) :
  4.     b = i // 100
  5.     c = (i % 100) // 10
  6.     d = i % 10
  7.     if i == b ** 3 + c ** 3 + d ** 3:
  8.         print i
复制代码


    b、c、d 的设置很被动,只适合寻找 3 位数的水仙花数,不如老师给出的答案科学,别人可以随意修改数值范围,而不用对程序做任何修改。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-29 23:46:52 | 显示全部楼层
daxia112233 发表于 2019-1-29 23:39
小甲鱼写得标准答案,我没看懂,我感觉还是我的代码比较好理解;

只是你觉得你的代码比较好而已,这里现在是3位数,如果题目出到了9位数,你是不是要abcdefghi一路算下去,然而标准答案不用,要往大的方向去看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-30 00:06:21 | 显示全部楼层
本帖最后由 虚无→与→飘渺 于 2019-1-30 13:50 编辑

可以这么理解
  1. for i in range(100, 1000):
  2.     sum = 0
  3.     temp = i
  4.     while temp:                                    #以下是i=153时候的例子
  5.         sum = sum + (temp%10) ** 3     # 通过temp%10来得到当前判断数字i=153的最后一位数,然后算三次方(3**3)并记录在sum里,现在sum=3**3
  6.         temp //= 10                # 通过小数点前移(除10小数点会向前移动一位),通过抹零‘//’去掉最后一位数,例如153在//后变成15.3,然后抹零变成15,(换行)
  7.                                     # 这样数字temp=153的最后一位就从153的3变成了15的5,方便循环下一步get到抹零之后的最后一位数字
  8.                                       # 循环回到sum那行,这回temp的最后一位变成了5,通过temp%10得到5之后计算5**3再与之前的3**3叠加,现在sum=3**3 + 5**3
  9.                                       #然后temp//=10抹零得到1(只剩一位了),最后循环一次sum,刚才两次的sum值(3**3 + 5**3)在叠加上1**3,现在sum=1**3+3**3+5**3
  10.     if sum == i:                     #sum=153之后在和原值i=153进行比对
  11.         print(i)                     #比对成功,打印153
复制代码
        


楼主如仍有疑问,欢迎追问

由于我也是刚学完这块不久,如有错误也欢迎大佬们指正

PLUS:小数点位移大法好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-30 00:48:20 | 显示全部楼层
通过while循环获取每个数字的值,进行计算加到新值上面楼上很详细了,我来水贴
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-30 09:16:01 | 显示全部楼层    本楼为最佳答案   
代码第一行:for 循环启动,从100-999迭代赋值给变量 i
       第二行:定义变量 sum = 0 #用于计算立方和
                    定义变量 temp = i # 把 for 循环当前迭代值赋值给 temp 我们假设现在 i = 153,那么temp也指向153
       第四行:启动while 循环 判断条件是 temp 归零时停止循环
       第五行:进入循环体
                    sum = sum + (temp%10)** 3 # 前面我们假设temp = 153,那么153与10取余 = 3,3的立方=27,sum 此时 =27;
                    接着 temp  //= 10 # 将 153地板除,现在temp = 15啦
       重新判断循环条件,temp = 15 ,不为零再次进入循环体
                    sum = sum +(temp%10)**3 # 此时sum = 27 + 125 = 152啦   
                    temp //= 10以后 temp = 1
       再次判断循环条件,temp= 1 ,再次进入循环体
                    sum = sum +(temp%10)**3 #此时sum = 27 + 125 + 1 = 153
                    temp //= 10 # temp 归零
推出循环

       如果 sum = i # 现在正好相等
       所以打印 i
                    
                    
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-30 16:05:11 | 显示全部楼层
要用  //  地板除除净剩余的小数点!

标准答案是 sum = sum + (temp%10)**3的意思是:
每次只对各位的数做处理
比如  358
      第一次分离出8  第二次分离出5  第三次分离出3
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-30 16:15:52 | 显示全部楼层
c = int(i/10%10)
d = int(i%10)
if b**3+c**3+d**3==i:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-30 16:17:15 | 显示全部楼层
python地板除法(//)直接抹去小数部分,一个数多少次方在Python中用**号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-2 22:34:27 | 显示全部楼层
经过大家的解释,我已经看懂小鱼老师的代码了,小鱼老师的代码确实比我写得有通用性,构思也很巧妙,真是佩服,老师就是老师!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-2 22:36:08 | 显示全部楼层
铁棍阿童木 发表于 2019-1-30 09:16
代码第一行:for 循环启动,从100-999迭代赋值给变量 i
       第二行:定义变量 sum = 0 #用于计算立方和 ...

最近几天都有事情,没及时看论坛更新,这位兄弟解释的最为清晰,就是最佳答案,谢谢~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-23 20:08:50 From FishC Mobile | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-2 02:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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