簡體   English   中英

如何在python中反復查找每個T數的數字總和的數字總和,直到成為單個數字?

[英]how to find the sum of digits of sum of digits of each of T numbers repeatedly in python till it gets to being a single digit number?

這是我編寫的代碼,用於從重復的次數中獲取數字總和,直到總和低於10:

T = int(input())
for i in range(T):
    N = int(input())
    def P():
            M = [int(d) for d in str(N)]
            N = sum(M)
            if N<10:
                    print(N)
            else :
                    return P()
    P()

在運行此代碼時,它給我一個錯誤,例如:

 Traceback (most recent call last): 
 File"C:/Users/AdityaShrivastava/AppData/Roaming/Python/Python36/Scripts/tes 
 ting.py", line 11, in <module>
 P()
 File "C:/Users/Aditya 
 Shrivastava/AppData/Roaming/Python/Python36/Scripts/testing.py", line 5, in 
 P
 M = [int(d) for d in str(N)]
 UnboundLocalError: local variable 'N' referenced before assignment

python中的函數聲明了新的作用域,這就是為什么N在函數中不可見的原因。 您可以通過將N傳遞到內部范圍來避免這種情況,如下所示:

T = int(input())
for i in range(T):
    N = int(input())
    def P(N):
            M = [int(d) for d in str(N)]
            N = sum(M)  # this line was the actual culprit
            if N<10:
                    print(N)
            else :
                    return P(N)
    P(N)

>>> 1      # test one time
>>> 12345  # cross total of 121212
6

Python在寫操作上比較保守。 僅從外部作用域變量讀取是可以的,但是重新分配名稱N (如果您寫N = sum(M)會發生這種情況)使它嚴格檢查該名稱的局部變量。

因此,它進一步假設尚未聲明的變量是您要從其上方的行中讀取的位置-坦率地說,這有點誤導。


有關python中作用域和名稱空間的更多信息,請參見此處

UnboundLocalError: local variable 'N' referenced before assignment是由於在函數P()中使用N而不聲明和初始化它的結果。

N = int(input())在循環內,但不在P()的范圍內。 循環中的最后一行P()將調用函數P()而不會返回到N = int(input()) ,其中N將被分配。

我已將代碼修改為

T = int(input())
for i in range(T):
    N = int(input())
    def P(N):
        M = [int(d) for d in str(N)]
        N = sum(M)
        if N<10:
            print(N)
        else :
            return P(N)
    P(N)

您可以通過在P函數中將N作為參數傳遞來解決此問題。

T = int(input())
for i in range(T):
N = int(input())
def P(n):
        M = [int(d) for d in str(n)]
        n = sum(M)
        if n<10:
                print(n)
        else :
                P(n)
P(N)

如果您在函數P中設置N的值,python會將其理解為使用該名稱創建一個局部變量。 該局部變量掩蓋了在函數外部使用的全局變量N。 因此,最好將N作為參數傳遞給函數P。

謝謝。

您正在使用遞歸來解決此問題。 簡單地使用循環會更有效:

def gimmeNumber(text):
    """"Helper: Asks for input until valid integer number is inputted. Retuns the number"""
    while True:
        T = input(text).strip()
        if T and T.isdigit():
            T = int(T)
            break
        print("Thats not a number ...")
    return T

def sumDigits(number):
    return sum(int(x) for x in str(number))

T = gimmeNumber("How many numbers? ")
for _ in range(T):
    s = 0
    N = gimmeNumber("Give me a number: ")
    # calculate the cross-sum
    s = sumDigits(N)
    while s > 9: # repeat while greater then 9  
        s = sumDigits(s)

    print(s)

輸入:4,然后999,888,333,111

輸出:

9
6
9
3

正如@Arne建議將gimmeNumber(text)更改為使用try/except ,它更適合於gimmeNumber(text) 要求寬恕而不是許可的心態,我同意。

盡管如此,上述變體仍然有效,並且對於初學者來說更容易理解。 這是try/except

def gimmeNumber(text):
    """"Helper: Asks for input until valid integer number is inputted. Retuns the number"""
    while True:
        try:
            T = int(input(text).strip())
            break
        except ValueError as e:
            print("Thats not a number ...")
    return T

有關輸入驗證的更多信息,建議在要求用戶輸入直到他們給出有效響應之前的答案中仔細閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM