【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: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: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)
新手来发表一下自己的愚见,还望多多指教
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比较,相等则是水仙花数,打印出来
(好像流水账,我的解释没能做到言简意赅) Twilight6 发表于 2020-8-2 14:19
是的,这里直接变量名 = 数值就是赋值操作,sum 就变成了一个变量名了
谢谢。部分理解了。各位数字的立方和在哪求了?在我的思路里感觉不是应该先找出 个 十 百位这样的吗,然后再计算?那这个步骤在这里是用什么替代了?我没看得太懂这个思路。 lzymm1 发表于 2020-8-3 16:16
谢谢。部分理解了。各位数字的立方和在哪求了?在我的思路里感觉不是应该先找出 个 十 百位这样的吗,然 ...
看看这样能看懂吗:
Twilight6 发表于 2020-8-3 16:21
看看这样能看懂吗:
不太明白这个思路是怎么样的,看是能看懂但是要我想我想不出来{:10_266:} Twilight6 发表于 2020-8-3 16:21
看看这样能看懂吗:
所以我思路现在就卡在这里,理解不了{:10_266:} 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]