鱼C论坛

 找回密码
 立即注册
查看: 1398|回复: 3

[已解决]零基础第9讲水仙花课后题

[复制链接]
发表于 2018-1-30 06:29:34 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 离别ai殇 于 2018-1-30 06:33 编辑

小白最近在看零基础的视频,对第9讲水仙花课后题有点疑问,求助大家。
水仙花数是三个整数的平方和,要求打印出(100,1000)所有的水仙花数。
这是给出的答案。

for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
        sum = sum + (temp%10) ** 3
        temp //= 10         # 注意这里要使用地板除哦~
    if sum == i:
        print(i)

从第一个数开始i=100, sum=0, temp=i=100, while 100: sum=sum+0, temp=10, if语句不满足,跳过。
然后是重新执行while语句吗,还是从i=101开始再执行?
还有就是问sum的语句,这是计算平方和的核心语句吗,temp除以10求余数是什么意思...
以及if语句判断sum=i?
因为循环顺序问题,就没有用100,101,102,103前几个数试验,希望大家不要喷我哈
最佳答案
2018-1-30 07:50:16

我估计你感到困惑的应该是里面的while循环
while temp:
        sum = sum + (temp%10) ** 3
        temp //= 10

temp % 10 得到的是temp这个值的个位数字,比如 111 % 10 == 1,234 % 10 == 4
(temp % 10) ** 3 表示这个数字的三次方,比如 2 ** 3 == 2 * 2 * 2 == 8
temp //= 10 表示temp右移1位,比如 123 // 10 == 12,234 // 10 == 23,地板除的意思是整除,只取整数部分而去掉小数部分

所以整个while循环的操作就是,拿temp=543举个例子
第一次循环
sum = 0 + 3 ** 3 = 9
temp = 54
第二次循环
sum = 9 + 4**3 = 9 + 64 = 73
temp = 5
第三次循环
sum = 73 + 5**3 = 73 + 125 = 198
temp = 0
第四次循环条件判定失败,跳出while循环,最终sum == 198
后续的判定中sum != 543
所以543不是水仙花数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-1-30 07:50:16 From FishC Mobile | 显示全部楼层    本楼为最佳答案   

我估计你感到困惑的应该是里面的while循环
while temp:
        sum = sum + (temp%10) ** 3
        temp //= 10

temp % 10 得到的是temp这个值的个位数字,比如 111 % 10 == 1,234 % 10 == 4
(temp % 10) ** 3 表示这个数字的三次方,比如 2 ** 3 == 2 * 2 * 2 == 8
temp //= 10 表示temp右移1位,比如 123 // 10 == 12,234 // 10 == 23,地板除的意思是整除,只取整数部分而去掉小数部分

所以整个while循环的操作就是,拿temp=543举个例子
第一次循环
sum = 0 + 3 ** 3 = 9
temp = 54
第二次循环
sum = 9 + 4**3 = 9 + 64 = 73
temp = 5
第三次循环
sum = 73 + 5**3 = 73 + 125 = 198
temp = 0
第四次循环条件判定失败,跳出while循环,最终sum == 198
后续的判定中sum != 543
所以543不是水仙花数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2018-1-30 08:27:00 | 显示全部楼层
核心代码是while temp:这个循环体,当temp归零的时候,循环结束:
第一步 sum = sum + (temp % 10)** 3 # 任何一个三位数与 10 取余,都将得到个位数字(如:123 % 10 等于3)

第二步 temp //= 10 相当于 temp = temp // 10  # 任何一个三位数与 10 进行地板除法都将得到百位数和十位数(如:123 // 10 等于 12)

循环执行以上两个步骤即可将一个三位数分解成为各个位数数值的立方和,即 sum 的值;
最后在while循环体外面进行判断,sum == i 的话就打印出 i 的数值;直到 for...in 循环结束。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-30 09:34:41 | 显示全部楼层
水仙花数是一个三位数,它的个十百位的三次方的和等于它本身。

楼主的第一个问题:while循环与if语句是同一层级的,因此需要while语句跳出后才执行if语句,也就是while 100后不会执行if,会再执行while 10, while 1,才会执行if,不满足,进入i=101循环……

第二个问题:sum语句是计算每位数的立方和,%10的作用是得到每一位数,如153%10=3,153//10=15,15%10=5,15//10=1,1%10=1,分别得到3,5,1,计算三次方后求sum。最后1//10=0,退出while循环
while循环退出后,判断sum是否等于i本身,如果相等,就是水仙花数,否则不是水仙花数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-6 12:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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