LintCode Python 水仙花數 (當n >= 6時報錯)
什麼是水仙花數
對於水仙花數的原始定義我們不需要深究,該題的描述如下:
水仙花數的定義是,這個數等於他每一位數上的冪次之和 見維基百科的定義
比如一個3位的十進制整數153就是一個水仙花數。因爲 。
而一個4位的十進制數1634也是一個水仙花數,因爲 。
給出n,找到所有的n位十進制水仙花數(可以認爲n <= 8)
再舉個例子,加入,那麼需要返回的水仙花數列表爲[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] |
可以發現,符合水仙花數條件的並不是很多。