LintCode Python 水仙花數(當n >= 6時報錯)

LintCode Python 水仙花數 (當n >= 6時報錯)

什麼是水仙花數

對於水仙花數的原始定義我們不需要深究,該題的描述如下:

水仙花數的定義是,這個數等於他每一位數上的冪次之和 見維基百科的定義
比如一個3位的十進制整數153就是一個水仙花數。因爲 153=13+53+33153 = 1^3 + 5^3 + 3^3
而一個4位的十進制數1634也是一個水仙花數,因爲 1634=14+64+34+441634 = 1^4 + 6^4 + 3^4 + 4^4
給出n,找到所有的n位十進制水仙花數(可以認爲n <= 8)

再舉個例子,加入n=1n = 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]

可以發現,符合水仙花數條件的並不是很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章