鱼C论坛

 找回密码
 立即注册
查看: 846|回复: 5

[已解决]小白python课后练习求详细解释

[复制链接]
发表于 2020-4-8 01:32:45 | 显示全部楼层 |阅读模式

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

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

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)


看得我一脸懵逼,求大神详细给解说从while之后的语句为什么要用这些运算方法
最佳答案
2020-4-8 02:19:32
你好,同小白!
while之后就是一个自循环,temp不变成0就一直循环。目的就是将个位、十位和百位数的立方和相加。
带入一个例子说明吧:
当i=112时,temp=i=112, temp%10是112除以10的余数,也就是2,这一步是取出个位数,然后再**3,是将个位数立方,并且存在sum这个值中。
然后将112地板除以10,结果就是11,这时候temp也就变成了=11,并且因为还不是0继续带入while循环:
当temp=11时, temp%10是11除以10的余数,也就是1,这一步是取出十位数,然后再**3,是将十位数立方,并且加上之前个位数的立方值存在sum这个值中。
然后将11地板除以10,结果就是1,这时候temp也就变成了=1,并且因为还不是0继续带入while循环:
当temp=1时, temp%10是1除以10的余数,也就是1,这一步是取出百位数,然后再**3,是将百位数立方,并且加上之前个位数的立方值和十位数的立方值存在sum这个值中。
然后将1地板除以10,结果就是0,这时候temp也就变成了=0,并且因为是0所以跳出了while循环:
至此,sum就按照要求变成了个位十位和百位数字的立方和,再和原数i进行比较~如果相同就打印,不同则i=i+1,返回for循环
这就是整个循环中的一个例子~希望你能明白
小白想升级。希望能被采用,谢谢!


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

使用道具 举报

发表于 2020-4-8 02:19:32 | 显示全部楼层    本楼为最佳答案   
你好,同小白!
while之后就是一个自循环,temp不变成0就一直循环。目的就是将个位、十位和百位数的立方和相加。
带入一个例子说明吧:
当i=112时,temp=i=112, temp%10是112除以10的余数,也就是2,这一步是取出个位数,然后再**3,是将个位数立方,并且存在sum这个值中。
然后将112地板除以10,结果就是11,这时候temp也就变成了=11,并且因为还不是0继续带入while循环:
当temp=11时, temp%10是11除以10的余数,也就是1,这一步是取出十位数,然后再**3,是将十位数立方,并且加上之前个位数的立方值存在sum这个值中。
然后将11地板除以10,结果就是1,这时候temp也就变成了=1,并且因为还不是0继续带入while循环:
当temp=1时, temp%10是1除以10的余数,也就是1,这一步是取出百位数,然后再**3,是将百位数立方,并且加上之前个位数的立方值和十位数的立方值存在sum这个值中。
然后将1地板除以10,结果就是0,这时候temp也就变成了=0,并且因为是0所以跳出了while循环:
至此,sum就按照要求变成了个位十位和百位数字的立方和,再和原数i进行比较~如果相同就打印,不同则i=i+1,返回for循环
这就是整个循环中的一个例子~希望你能明白
小白想升级。希望能被采用,谢谢!


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-4-8 04:16:31 | 显示全部楼层
leon_xinxin 发表于 2020-4-8 02:19
你好,同小白!
while之后就是一个自循环,temp不变成0就一直循环。目的就是将个位、十位和百位数的立方和 ...

谢谢你的详细解释!
看明白了整个循环,总算知道%10是要取出个位数的值,只是还不懂为什么要用地板除,如果不用地板除的话还有其他方法可以解吗,我根本想不到要用地板除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 04:37:24 | 显示全部楼层
珍珠是认真的 发表于 2020-4-8 04:16
谢谢你的详细解释!
看明白了整个循环,总算知道%10是要取出个位数的值,只是还不懂为什么要用地板除, ...

//10这个地板除的目的是去除最后一位数,比如112会变成11,2131会变成213。
这个方法很有用的,就像是列表的pop()函数,踢出最后一个
可以看看我自己写的这个方法:
print('求 100~999 之间的所有水仙花数')
i=100
a=i//100 #百位
b=i//10-a*10 #十位
c=i-a*100-b*10 #个位
while i<1000:
    if i==(a**3)+(b**3)+(c**3):
        print(i)
        i+=1
    else:
        i+=1
    a=i//100 #百位
    b=i//10-a*10 #十位
    c=i-a*100-b*10 #个位
        
虽然也会用到地板除。。。但是少很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 15:59:41 | 显示全部楼层
print('求 100~999 之间的所有水仙花数')
i=100
a=i//100 #百位
b=i//10-a*10 #十位
c=i-a*100-b*10 #个位
while i<1000:
    if i==(a**3)+(b**3)+(c**3):
        print(i)
        i+=1
    else:
        i+=1
    a=i//100 #百位
    b=i//10-a*10 #十位
    c=i-a*100-b*10 #个位
        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-9 06:00:15 | 显示全部楼层
leon_xinxin 发表于 2020-4-8 04:37
//10这个地板除的目的是去除最后一位数,比如112会变成11,2131会变成213。
这个方法很有用的,就像是列 ...

你真的是是小白吗,我们怎么差这么远,我都想不到用这些方法,太厉害了,谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 05:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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