qiuyouzhi 发表于 2020-3-7 12:26:55

Python FAQ 026 水仙花数(2)

本帖最后由 qiuyouzhi 于 2020-3-20 16:04 编辑

Python FAQ 026 水仙花数

问题:

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

是这个样子的。
但是我用的是用地板除,将各个数位的值算出来再进行
for num in range(100,1000):
      hundred=num//100
      ten=(num//10)%10
      single=num%10
      if num==hundred**3+ten**3+single**3:
         print(num)

但是我看不懂小甲鱼的思路(一点都不懂),能有大神帮我解读一下嘛?

我的解答:
for i in range(100, 1000):
   sum = 0 # 求和变量
   temp = i # 不用i变量,防止被修改
   while temp: # 只要temp不为0
         sum = sum + (temp%10) ** 3 # 这是求末位,可以试一下153 % 10,结果肯定是3
         temp //= 10 # 这里是去掉一位,用地板除是防止有小数,而且不用地板除达不到效果,可以试试153/10
   if sum == i:# 如果符合要求,就输出
         print(i)

peterpan2030 发表于 2020-3-7 16:46:33

我是这样理解的:
判断一个三位数的数字abc,甲鱼的思路是通过while循环
第一次循环:提取出个位数c(即由abc%10得c**3),十位百数ab(即abc//10)
第二次循环:提取出十位数b(即由ab%10得b**3),百位数a(即ab//10)
第三次循环:提取出百位数a(即由a%10得得a**3),这次循环后temp=0 false(此时while false 循环结束)
此时得到sum = a**3 + b**3 + c**3,再判断sum与i是否相等,相等则print(i)
甲鱼的思路与你的思路其实一样(因为水仙花数的判断方式就是这样,都是这个思路)只是实现方法不同而已罢了!
个人理解,欢迎指教。

LA阿鑫 发表于 2020-3-8 22:32:53

你看看我的图

flamezyy 发表于 2020-3-8 22:56:23

本帖最后由 flamezyy 于 2020-3-8 22:58 编辑

比如一个数255,我们首先要分别提取出百位十位个位,那可以用地板除法:
255 // 10 = 25 ... 5       temp = 255
25//10 = 2... 5      temp = 25
5   //10=0 ... 5         temp = 5
0//   10=0                temp = 0
可以看到当temp=0时,全部提取完毕,所以 循环终止可以设为while(temp)。
然后就是求所有余数的立方和 :
sum = sum + (temp%10)**3
如果sum == i(即temp):
打印i

一个账号 发表于 2020-3-31 17:22:18

我的是这样:

import math

for i in range(100, 1000):
    num = list(str(i))
    num =
    if math.pow(num, 3) + math.pow(num, 3) + math.pow(num, 3) == i:
      print(i, "是水仙花数!")
页: [1]
查看完整版本: Python FAQ 026 水仙花数(2)