继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

[硕.Love Python] 水仙花数

程序员硕
关注TA
已关注
手记 19
粉丝 1.7万
获赞 886

1.题目:
水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。如: 1^3+5^3+3^3=153, 8^4+2^4+0^4+8^4 = 8208.
求100~9999之间所有的水仙花数

2.源码:

[n for n in xrange(100, 10000) if (lambda sn: sum(int(x) ** len(sn) for x in sn) == n)(str(n))]

3.思路:拆开 -> 乘方 -> 加和 -> 比较.

打开App,阅读手记
17人推荐
发表评论
随时随地看视频慕课网APP

热门评论

看完题目,首先自己不看答案直接想解决办法,如下:

#coding=utf-8
def func(num):
    #不知道怎么拆开多位数字,用str()
    s_num=str(num)
    res=0
    for i in xrange(len(s_num)):
        res+=int(s_num[i])**len(s_num)
    return num == res
l=[]
for x in xrange(100,10000):
    if func(x):
        l.append(x)
print l
[153, 370, 371, 407, 1634, 8208, 9474]

然后再看答案,惊喜的发现,老师也是用str()来拆数字的。

还有,字符串可以直接迭代


自己再默写一遍

l=[n for n in xrange(100,10000) if (lambda sn:sum(int(s)**len(sn) for s in sn)==int(sn))(str(n))]
print l
[153, 370, 371, 407, 1634, 8208, 9474]

对lambda的理解加深了

n for n in xrange(100, 10000)这个两个n分别代表什么呢?



老师,最后的str(n)是把n的数字拆成字符串传给sn了么?这一步太快了,没明白过来~~

查看全部评论