lzymm1 发表于 2020-8-2 14:17:45

【Python新手求助】第九节课后作业 求水仙花数

1. 编写一个程序,求 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)
这段代码没有看懂,有没有大佬解释一下?
sum在这是用来当函数名了还是?
%到底是怎么用的?不是左边被右边整除,然后输出余下的数吗?
地板除又是怎么个用法?

zltzlt 发表于 2020-8-2 14:18:52

本帖最后由 zltzlt 于 2020-8-2 14:20 编辑

1. sum 在这里是一个变量名
2. % 就是取余数,例如:
>>> 5 % 4
1
>>> 10 % 2    # 余零,也就是能够整除
0
3. 地板除 // 就是取商的整数部分,舍去小数部分,例如:

>>> 4 // 3
1
>>> 6 // 3
2
4. 请见:https://fishc.com.cn/forum.php?mod=viewthread&tid=175149

Twilight6 发表于 2020-8-2 14:19:11

本帖最后由 Twilight6 于 2020-8-2 14:29 编辑



sum在这是用来当函数名了还是?

是的,这里直接变量名 = 数值就是赋值操作,sum 就变成了一个变量名了

%到底是怎么用的?不是左边被右边整除,然后输出余下的数吗?

% 就是求余运算符,比如1 % 10 ,就是求 1 除以 10 之后剩余的数,因为不够除 余 1 ,所以结果为 1

地板除相当于 / 除法后 int 去除小数点了

地板除就相当于你用 普通 除法后 在 用 int 函数转为整型


看看这里拿当 for 循环到 153 时候,循环解析,看注释的循环顺序哈:

for i in range(100, 1000):# 找100~999的水仙花数

    sum = 0# 初始化数值,用于后面计算 百十个位数各自3次方的总和

    temp = i# 找个临时变量来暂时赋值,用于记录本身的值,因为后面计算会改变原本的值

    while temp:
      # 将temp 作为循环条件
      # 假设第1次循环temp = 153
      # 则第2次循环temp = 15
      # 第3次temp=1
      # 第4次因temp=0退出循环

      sum = sum + (temp % 10) ** 3
      # 第1次循环 sum = 0+(153%10)**3,sum = 27
      # 第2次循环 sum = 27+(15%10)**3,sum = 152
      # 第3次循环 sum = 152+(1)**3 , sum = 153

      temp //= 10
      # temp//10 = 15,则第1次循环 temp = 15
      # 第2次循环 temp//10 = 1 ,temp=1
      # 第3次 temp//10 = 0 则 temp=0

    if sum == i:# 退出循环后判断是否与本身相等, 若是打印,不是则开启下一次for循环

      print(i)



FindingB 发表于 2020-8-2 15:56:13

新手来发表一下自己的愚见,还望多多指教
sum就只是一个变量名
%是求余数的,例如153%10结果是3
首先每次for循环中的i赋值给temp,while temp肯定为真进入循环
在第一遍循环中sum=sum+(tem%10)**3是求个位数的三次方
temp//=10得到的结果相当于抹去个位数,153//10是15
在第二遍循环中,因为temp被地板除变成一个两位数,temp%10得到的余数就是原来三位数的十位数,sum=sum+(tem%10)**3是上一步个位数的三次方与十位数三次方的和
temp//=10得到的结果相当于两位数再抹去个位数,15//10是1
以此类推sum被赋值为各位数字的立方和,千位上的数字一定小于等于9,被地板除以后的temp为0跳出while循环
此时sum与i比较,相等则是水仙花数,打印出来
(好像流水账,我的解释没能做到言简意赅)

lzymm1 发表于 2020-8-3 16:16:22

Twilight6 发表于 2020-8-2 14:19
是的,这里直接变量名 = 数值就是赋值操作,sum 就变成了一个变量名了




谢谢。部分理解了。各位数字的立方和在哪求了?在我的思路里感觉不是应该先找出 个 十 百位这样的吗,然后再计算?那这个步骤在这里是用什么替代了?我没看得太懂这个思路。

Twilight6 发表于 2020-8-3 16:21:01

lzymm1 发表于 2020-8-3 16:16
谢谢。部分理解了。各位数字的立方和在哪求了?在我的思路里感觉不是应该先找出 个 十 百位这样的吗,然 ...



看看这样能看懂吗:



lzymm1 发表于 2020-8-3 16:49:35

Twilight6 发表于 2020-8-3 16:21
看看这样能看懂吗:

不太明白这个思路是怎么样的,看是能看懂但是要我想我想不出来{:10_266:}

lzymm1 发表于 2020-8-3 19:22:16

Twilight6 发表于 2020-8-3 16:21
看看这样能看懂吗:

所以我思路现在就卡在这里,理解不了{:10_266:}

Twilight6 发表于 2020-8-3 19:35:13

lzymm1 发表于 2020-8-3 19:22
所以我思路现在就卡在这里,理解不了



思路不是很明了吗,你用求余运算符,每次都可以将 个位数的值求出,然后在三次方即可

比如这里的 153

153 % 10 --> 3然后 将 153 // 10 去掉个位数 3 --> 15

15 % 10 --> 5 然后 将 15 // 10 去掉个位数 5 --> 1

1 % 10 --> 1 然后将 1 // 10 去掉个位数1 --> 0




页: [1]
查看完整版本: 【Python新手求助】第九节课后作业 求水仙花数