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的所有水仙花数,如下表:
n | narcissistic 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] |
可以发现,符合水仙花数条件的并不是很多。