珍珠是认真的 发表于 2020-4-8 01:32:45

小白python课后练习求详细解释

题目:
编写一个程序,求 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之后的语句为什么要用这些运算方法

leon_xinxin 发表于 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循环
这就是整个循环中的一个例子~希望你能明白
小白想升级。希望能被采用,谢谢!


珍珠是认真的 发表于 2020-4-8 04:16:31

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

谢谢你的详细解释!
看明白了整个循环,总算知道%10是要取出个位数的值,只是还不懂为什么要用地板除,如果不用地板除的话还有其他方法可以解吗,我根本想不到要用地板除{:5_100:}

leon_xinxin 发表于 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 #个位
      

虽然也会用到地板除。。。但是少很多

8178919 发表于 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 #个位
      

珍珠是认真的 发表于 2020-4-9 06:00:15

leon_xinxin 发表于 2020-4-8 04:37
//10这个地板除的目的是去除最后一位数,比如112会变成11,2131会变成213。
这个方法很有用的,就像是列 ...

你真的是是小白吗,我们怎么差这么远,我都想不到用这些方法{:5_100:},太厉害了,谢谢你
页: [1]
查看完整版本: 小白python课后练习求详细解释