LintCode Python 水仙花数(当n >= 6时报错)

LintCode Python 水仙花数 (当n >= 6时报错)

什么是水仙花数

对于水仙花数的原始定义我们不需要深究,该题的描述如下:

水仙花数的定义是,这个数等于他每一位数上的幂次之和 见维基百科的定义
比如一个3位的十进制整数153就是一个水仙花数。因为 153 = 1 3 + 5 3 + 3 3 153 = 1^3 + 5^3 + 3^3 153=13+53+33
而一个4位的十进制数1634也是一个水仙花数,因为 1634 = 1 4 + 6 4 + 3 4 + 4 4 1634 = 1^4 + 6^4 + 3^4 + 4^4 1634=14+64+34+44
给出n,找到所有的n位十进制水仙花数(可以认为n <= 8)

再举个例子,加入 n = 1 n = 1 n=1,那么需要返回的水仙花数列表为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。

代码修改前(Python 3)

def narcissistic_number(n):
    # n = 3, e.g. 153 = 1^n + 5^n + 3^n
    result = []
    start = pow(10, n - 1) - 1 if n == 1 else pow(10, n - 1)
    end = pow(10, n)
    for value in range(start, end):
        if judge(value, n):
            result.append(value)

    return result

def judge(value, n):
    # 判断一个数是否为水仙花数
    # 153 n = 3
    val = value
    sum_ = 0
    for i in range(n, 0, -1):
		sum_ += pow(val // pow(10, i - 1), n)
		if sum_ > value:
			return False
		val = val % pow(10, i - 1)
	return sum_ == value

代码修改后(顺利通过)

def judge(value, n):
    # 判断一个数是否为水仙花数
    # 153 n = 3
    sum_ = sum([pow(int(e), n) for e in list(str(value))])
    return value == sum_

因为在便利范围数据的时候实在是没想出来有什么好的方法,所以想着优化一下判断这块,那么这里的话把Judge函数中的数值分解过程用list直接替换了,做法就是先转成str然后再转回list,然后再转为int,然后在列表表达式中直接求幂指数,然后用sum对list求和,就得到了求和后的结果,不过,函数调用也需要花费一定的时间,所以不用Judge这个函数了,直接重写为下式:

def narcissistic_number(n):
    # n = 3, e.g. 153 = 1^n + 5^n + 3^n
    result = []
    start = pow(10, n - 1) - 1 if n == 1 else pow(10, n - 1)
    end = pow(10, n)
    for value in range(start, end):
        if value == sum([pow(int(e), n) for e in list(str(value))]):
            result.append(value)

    return result

大功告成~顺便给出N <= 8的所有水仙花数,如下表:

nnarcissistic number
1[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2[]
3[153, 370, 371, 407]
4[1634, 8208, 9474]
5[54748, 92727, 93084]
6[548834]
7[1741725, 4210818, 9800817, 9926315]
8[24678050, 24678051, 88593477]

可以发现,符合水仙花数条件的并不是很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值