鱼C论坛

 找回密码
 立即注册
查看: 970|回复: 6

[已解决]水仙花数的计算

[复制链接]
发表于 2018-8-7 20:21:26 | 显示全部楼层 |阅读模式
4鱼币
零基础入门的第9讲的课后题 水仙花数的计算那个程序
for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
        sum = sum + (temp%10) ** 3
        temp //= 10         # 注意这里要使用地板除哦~
    if sum == i:
        print(i)


看不懂 求大神帮忙解释一下
最佳答案
2018-8-7 20:21:27
我估计你感到困惑的应该是里面的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不是水仙花数

最佳答案

查看完整内容

我估计你感到困惑的应该是里面的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循环的操作 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-7 20:21:27 | 显示全部楼层    本楼为最佳答案   
我估计你感到困惑的应该是里面的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不是水仙花数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-7 20:25:41 | 显示全部楼层
就是先用for送代一个100~999的数列,假如有数每一位的平方加起来等于它本身就输出
用地板除的原因是:
首先你要知道分割数字的方法之一:
1.数字对10求余,求出一位
2.数字减去刚刚求出来的一位
3.数字除以10
4.重复第一步
但是这个步骤是可以简化的:
1.数字对10求余,求出一位
2.数字地板除除以10
3.重复第一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-8 08:54:38 | 显示全部楼层
while temp 就是while true的意思
举个栗子
比如说数字321,我们首先要做的是将它拆分成3,2,1,然后验证它是否满足水仙花数的要求
此时 sum=0+(321%10)**3  这个表示的是个位数的三次方;(321除以10等于32余1)
temp//=10的意思是temp=temp//10  
此时,temp=321//10=32
然后再进行第二轮while循环
此时,sum=1**3+(32%10)**3    这个时候的式子,就是个位数的三次方加上十位数的三次方
然后下一步同上,32整除10,得3
再回到循环里面
此时sum=1**3+(32%10)**3+3**3
然后验证sum 是否等于i
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-8 13:35:46 | 显示全部楼层
BngThea 发表于 2018-8-8 08:44
我估计你感到困惑的应该是里面的while循环
while temp:
        sum = sum + (temp%10) ** 3

我也是看不懂這段,有這位大佬的解是終於清楚了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-12 13:45:15 | 显示全部楼层
谢谢你们的答案,之前不知道看论坛,我已经头疼两天了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-12 13:50:20 | 显示全部楼层
无符号整形 发表于 2018-8-7 20:25
就是先用for送代一个100~999的数列,假如有数每一位的平方加起来等于它本身就输出
用地板除的原因是:
首 ...

厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 18:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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