python最簡單代碼解決數根(九餘數)問題!

codewar上面的一道題目:
給任意一個自然數,將各位上的數字加起來,如果得到一個大於一位數的結果,則再計算,知道得到一個一位數,那麼這個一位數就是這個數的樹根。利用代碼求一個自然數的樹根。
正常的思維代碼如下:

def digital_root(n):
    digital_sum = sum([int(i) for i in list(str(n))])
    if len(str(digital_sum)) == 1:
        return digital_sum
    return digital_root(digital_sum)

以上是最起碼的解法,但是這裏面還有一個最優的解法,涉及到了九餘數原理(如下):
(1)兩個或多個數的加減乘除得到的結果的數根,等於對應各個數的數根的加減乘除的結果的樹根。
(2)一個數的數根(特殊情況,如果數根爲9,按0算)等於該數對9取餘的結果。
具體的證明可以用一個等式:
X = 100*a + 10*b + c = 99*a + 9*b + (a+b+c)
上面的等式可以看出,任意一個數的樹根等於對9的餘數。
那麼上面的代碼就可以簡化如下:

def digital_root(n): 
    return n%9 or n and 9

就是直接返回對9的餘數就行了,但是要具體處理下99,999等情況,所有利用and函數進行返回。

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