如何将一个数字的各位数相加,直到只剩下一个数字。

4
我想解决这个问题,但是我不知道该怎么做。
我会非常感激你的帮助。
给定一个数n,将n的各个位数相加,如果得到的值有多位数,就继续相加,直到只剩下一个位数。
期望的输出:
16 -> 1 + 6 = 7
942 -> 9 + 4 + 2 = 15 -> 1 + 5 = 6

我尝试了这个,但我不知道如何重复它直到只剩下一个数字。
Def sum_digit(n):
 list_of_digits = list(map(int,str(n)))

su = []
for x in list_of_digits:
x = sum(list_of_digits)
su = x

print(su)

sum_digit(6784)

当你运行这个命令时,输出是什么?"不工作"是指什么?另外,你的函数返回什么?为什么在这里使用了一个for循环?如果你能回答这些问题,你就会更接近答案了。 - undefined
缩进在Python中具有语义上的重要性。你的代码片段似乎已经被去除了缩进。你的代码中没有处理"直到只剩一个"的部分。 - undefined
9个回答

6
从这个result开始,每个整数对于其各位数字的和模9同余。
证明很简单:
n ≡ sum_{k=0}^{m} 10^k d_k (mod 9) ≡ sum_{k=0}^{m} (9+1)^k d_k (mod 9) ≡ sum_{k=0}^{m} d_k (mod 9),其中 m = n的位数 - 1
因此,只需简单计算 n % 9 就可以找到 n 的各位数字的和,直到得到一位数,无需任何循环/递归。
def sum_digits(n): # assumes n > 0, otherwise n = 0 is trivial
    # assert(n > 0)
    return (n-1) % 9 + 1                # 1. this will work
    # return n % 9 if n % 9 else 9      # 2. this will also work

1
我认为你需要在n==9时设置一个条件,返回9,否则返回n%9 - undefined
1
@SandipanDey 没问题,但我仍然认为你没有理解问题的要点。 - undefined
你是对的,对于所有的n>0,(n-1) % 9 + 1解决了问题,而且不需要使用if-else比较。 - undefined
@SandipanDey ..是的,现在很好了。 - undefined
1
我相信@DarkKnight所指出的是这显然是一个初学者的问题,几乎可以确定这个问题并不受性能限制。你的解决方案虽然优雅,但对于那些可能会问出这样问题的Python初学者来说,它既没有说明性,也没有帮助性。 - undefined
显示剩余4条评论

6
你可以使用一个 while 循环来重复执行,直到数字减少到个位数为止。
def sum_digit(n):
    while n > 9:
        n = sum(int(i) for i in str(n))
    return n

sum_digit(16)
#7

sum_digit(942)
#6

1
@ArikyHito.. 因为9之前的所有数字都是个位数。比如0,1,2,3..9。超过9之后,它们变成了两位数。所以任何大于9的数字都应该加起来,使其成为个位数。 - undefined

1
你可以将当前数字的各个位数相加,并将结果传递给递归调用,直到得到一个个位数。
def sum_digit(n):
    return sum_digit(sum(map(int, str(n)))) if n > 9 else n

为了:
print(sum_digit(16))
print(sum_digit(942))

输出:

7
6

1
将值转换为字符串并枚举数字(如其他答案中建议的)是有效但较慢的方法。你可以纯粹通过算术运算来实现:
def sum_digit(n: int) -> int:
    while (_n := n) > 9:
        n = 0
        while _n > 0:
            n += _n % 10
            _n //= 10
    return _n

0
另一种使用递归的方法:
def digital_root(n):
    total = 0
    while n > 0:
        digit = n % 10
        total += digit
        n //= 10
    if total > 9:
        return digital_root(total)
    else:
        return total

print(digital_root(942)) # 6

0
你可以使用一个while循环来持续进行求和过程,直到数字减少到个位数为止。
def sum_digits_until_single_digit(num):
    while num >= 10:
        total = 0
        for digit in str(num): 
            total += int(digit)
        num = total
    return num

0
使用递归函数将数字的各个位数相加,直到只剩下一个位数。
def sum_digits(n):

   list_of_digits = list(map(int, str(n)))

   digit_sum = sum(list_of_digits)

   # If the sum has more than one digit, call the function recursively

   if digit_sum >= 10:
     return sum_digits(digit_sum)
   else:
     return digit_sum

0
这是我的解决方案:
确保在keep_adding函数中重新初始化sum = 0,以使其忘记先前计算的总和。
digit = 9999999999999999999999999888
def check_length(x):
    if len(str(x))>1:
        return True

def keep_adding(digit):
    sums=0
    for i in str(digit):
        sums+=int(i)
    return sums

while check_length(digit):
    digit=keep_adding(digit)

print(digit)

我尝试了几个不同的digit值,看起来它的工作符合预期。

0
你可以使用递归来提高效率。
以下是我使用递归的解决方案:
def sum_of_digits(n):
    # Base case: if n is a single digit, return it
    if n < 10:
        return n
    
    
    digits = [int(digit) for digit in str(n)]
    
    # Calculate the sum of the digits
    total_sum = sum(digits)
    
    
    return sum_of_digits(total_sum)

输出结果

print(sum_of_digits(16))  # Output: 7
print(sum_of_digits(942)) # Output: 6
print(sum_of_digits(6784)) # Output: 5

使用递归实现可以使你的代码更简洁,但不一定更高效。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接