wgz890813 发表于 2018-2-8 14:02:17

水仙花数小甲鱼答案的疑问

我觉得水仙花数这样的答案更容易理解

for x in range(1,10):
    for y in range(0,10):
      for z in range(0,10):
            if 100*x + 10*y + z == x**3 + y**3 + z**3 and 100<=100*x + 10*y + z<=999:
                print(100*x + 10*y + z,end = "")
               
对于小甲鱼的答案,没有理解,为什么那样写源代码,while循环那样写的依据是什么?
for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
      sum = sum + (temp%10) ** 3
      temp //= 10         # 注意这里要使用地板除哦~
    if sum == i:
      print(i)

BngThea 发表于 2018-2-8 14:15:59

我估计你感到困惑的应该是里面的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不是水仙花数

checkily 发表于 2018-2-8 19:27:32

本帖最后由 checkily 于 2018-2-8 19:29 编辑

是的,这个取余和地板除方法很好用的,我也卡了好久没想明白。练习多了,就慢慢明白了。
其实只要能实现就行。当然理解别人写的也很重要。你的写法是没问题的。
我的写法跟小鱼的也不同:
def fun1():
    for each in range(100,1000):
      result=0
      for j in :   #把数字转成字符,再转成列表
            result+=int(j)**3
      if result==each:
            print(result,end=",")
print("所有水仙花数分别是:",end="")
fun1()

wgz890813 发表于 2018-2-9 06:31:53

BngThea 发表于 2018-2-8 14:15
我估计你感到困惑的应该是里面的while循环
while temp:
      sum = sum + (temp%10) ** 3


感谢您的讲解,思路很清晰!% 和 // 还能这样结合用,学习了!

wgz890813 发表于 2018-2-9 06:38:13

checkily 发表于 2018-2-8 19:27
是的,这个取余和地板除方法很好用的,我也卡了好久没想明白。练习多了,就慢慢明白了。
其实只要能实现就 ...

哇, 你的也很高端,也得好好思考,不懂再向您请教!
页: [1]
查看完整版本: 水仙花数小甲鱼答案的疑问