鱼C论坛

 找回密码
 立即注册
查看: 1892|回复: 11

[已解决]零基础python第009课习题:水仙花数求详细解

[复制链接]
发表于 2017-12-12 01:05:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
        sum = sum + (temp%10) ** 3
        temp //= 10         # 注意这里要使用地板除哦~
    if sum == i:
        print(i)
最佳答案
2017-12-12 08:56:19
我估计你感到困惑的应该是里面的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不是水仙花数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-12 08:28:19 | 显示全部楼层
#方法一
# for x in range(100,1000):
#     bai = x//100
#     shi = x%100//10
#     ge = x%10
#     m = bai**3 + shi**3 + ge**3
#     if x == m:
#         print(x)


#方法二
# for x in range(100,1000):
#     s = str(x)
#     bai = int(s[0])
#     shi = int(s[1])
#     ge = int(s[2])
#     m = bai**3 + shi**3 + ge**3
#     if x == m:
#         print(x)


#方法三
# for bai in rang(1,10):
#     for shi in rang(1,10):
#         for ge in rang(1,10):
#         m = bai**3 + shi**3 + ge**3
#         x = bai * 10 + shi * 10 + ge
#         if x == m:
#             print(x)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-12 08:56:19 | 显示全部楼层    本楼为最佳答案   
我估计你感到困惑的应该是里面的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不是水仙花数

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zhuoyue65 + 2 + 2 + 1 感谢。本来想提问的,发现看了之后懂了。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-12 11:22:58 | 显示全部楼层
首先你要知道什么叫水仙花数,看红色部份
for i in range(100, 10000000):
        sum = 0
        length=len(str(i))
        temp = i
        while temp:
                sum = sum + (temp%10) ** length
                temp //= 10         # 注意这里要使用地板除哦~
        if sum == i:
                print(i)

'''
水仙花数是指一个 n 位数(n≥3 ),
它的每个位上的数字的 n 次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)

假设这个数为153:
        
循环1:temp=153
153 % 10 = 3 #求出 153的个位
3 ** 3 = 27
153 // 10 = 15 #去除 153的个位


循环2:temp=15
15 % 10 = 5 #求出 15个位
5 ** 3 = 125
15 // 10 = 1 #去除 15的个位

循环3:temp=1
1 % 10 = 1 # 求出1的个位
1 ** 3 = 1
1 // 10 = 0 # 去除 1的个位

循环4:temp=0 退出循环


水仙花数又称阿姆斯特朗数。
一位自幂数:独身数      1**1
两位自幂数:没有
三位自幂数:水仙花数    153=1**3+5**3+3**3
四位自幂数:四叶玫瑰数  1634=1**4+6**4+3**4+4**4
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
'''

评分

参与人数 1荣誉 +1 鱼币 +2 收起 理由
zhuoyue65 + 1 + 2 感谢。本来想提问的,发现看了之后懂了。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-13 10:01:55 | 显示全部楼层
BngThea 发表于 2017-12-12 08:56
我估计你感到困惑的应该是里面的while循环
while temp:
        sum = sum + (temp%10) ** 3

看来BngThea写的这么详细,把我的疑惑也解开了。非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-13 11:02:42 | 显示全部楼层
573160769 发表于 2017-12-12 08:28
#方法一
# for x in range(100,1000):
#     bai = x//100

方法一怎么就出来4个数啊153,370,371,407
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-13 11:09:50 | 显示全部楼层
573160769 发表于 2017-12-12 08:28
#方法一
# for x in range(100,1000):
#     bai = x//100

for i in range(100,1000):
怎么我用这个程序输出的是8个数,有几个不是水仙数   
sum=0
    temp=i
    while temp:
        sum=sum+(temp%10)**3   
        temp//=10    #这里使用地板除,
        if sum ==i:
            print(i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-14 01:19:29 From FishC Mobile | 显示全部楼层
moyuqqxing 发表于 2017-12-13 11:02
方法一怎么就出来4个数啊153,370,371,407

4个是正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-18 23:00:13 | 显示全部楼层
for i in range(10000, 100000):
    if i==(i%10)**5+(i//10%10)**5+(i//100%10)**5+(i//1000%10)**5+(i//10000)**5: print(i)
鱼老师的一时半会看不懂,还是这样写简单易懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 22:54:24 | 显示全部楼层
本帖最后由 冰封雪舞 于 2017-12-19 22:55 编辑
moyuqqxing 发表于 2017-12-13 11:09
for i in range(100,1000):
怎么我用这个程序输出的是8个数,有几个不是水仙数   
sum=0


因为你的if sum==i:这一句缩进错了,你这一句缩进在while循环里边了,也就是说如果这个三位数的个位数的立方=这个三位数,或者个位数与十位数的立方的和=这个三位数,这几种情况也打印出来。你把它缩进提前到while循环外就可以了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-20 14:00:29 | 显示全部楼层
冰封雪舞 发表于 2017-12-19 22:54
因为你的if sum==i:这一句缩进错了,你这一句缩进在while循环里边了,也就是说如果这个三位数的个位数 ...

按照你的方法改了,输出了4个正确的数。谢谢!真的是格式为王啊,一点儿都不能疏忽。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-20 15:04:09 | 显示全部楼层
moyuqqxing 发表于 2017-12-20 14:00
按照你的方法改了,输出了4个正确的数。谢谢!真的是格式为王啊,一点儿都不能疏忽。

关键是你要理解缩进在while里边程序是怎么运行的,为什么为多出那几个数字,理解了以后,你就又有进步了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 00:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表