如何对一个数字的数字求和,直到有一个

How to sum digits of a number untill there is one

提问人:Ariky Hito 提问时间:9/26/2023 最后编辑:Goku - stands with PalestineAriky Hito 更新时间:10/18/2023 访问量:195

问:

我想解决这个问题,但我不知道该怎么做

感谢您的帮助

给定 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)
python-3.x 函数 和数字

评论

0赞 icedwater 9/26/2023
运行此命令时的输出是什么,什么是“不起作用”?另外 - 你的函数返回什么?你为什么在这里使用循环?如果你能回答这些问题,你就会更接近你的答案。for
0赞 Clifford 10/11/2023
缩进在 Python 中具有语义意义。您的代码片段似乎已去除其缩进。代码中没有任何内容涉及“直到有一个”。

答:

0赞 darshita_baldha 9/26/2023 #1

使用递归函数对数字的数字求和,直到只剩下一位数字。

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
6赞 Goku - stands with Palestine 9/26/2023 #2

您可以使用循环重复,直到数字减少到一位数。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赞 Goku - stands with Palestine 9/27/2023
@ArikyHito..因为 9 之前的所有数字都是个位数。喜欢。9 之后,它们变为两位数。因此,任何大于应该添加的内容都应添加为个位数0,1,2,3..99
1赞 blhsing 9/26/2023 #3

您可以将当前号码的位数之和传递给递归调用,直到它成为个位数:

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赞 CtrlZ 9/26/2023 #4

将值转换为字符串并枚举数字(如其他答案中建议的那样)是有效的,但速度很慢。您可以按如下方式进行纯粹的算术操作:

def sum_digit(n: int) -> int:
    while (_n := n) > 9:
        n = 0
        while _n > 0:
            n += _n % 10
            _n //= 10
    return _n
6赞 Sandipan Dey 9/26/2023 #5

从这个结果来看,每个整数都与其数字 mod 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),当 = 中的位数mn - 1

因此,只需计算以找到直到一个数字的数字之和,而无需任何循环/递归。n % 9n

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赞 Goku - stands with Palestine 9/26/2023
我认为你必须在以下情况下提出一个条件n==9 return 9 else return n%9
0赞 Goku - stands with Palestine 9/26/2023
以 的任意倍数为例。它应该返回,如果你这样做,它会返回18, 27, 3699n%90
0赞 CtrlZ 9/26/2023
@SandipanDey 只需稍作修改,这将非常有效。但是,我认为 OP 确实在尝试了解如何以迭代方式实现这一点
1赞 CtrlZ 9/26/2023
@SandipanDey 没关系,但我仍然认为你错过了问题的重点
1赞 JonSG 9/26/2023
我相信@DarkKnight所指出的是,这显然是一个新手问题,几乎可以肯定是一个不受性能限制的问题。你的解决方案虽然优雅,但对于那些接触 python 的人来说,这既没有说明性,也没有帮助,可能会导致他们提出这样的问题。
0赞 Muhammad Shamshad Aslam 9/26/2023 #6

这是我的解决方案:

确保在函数中重新初始化 ,使其忘记先前计算的总和。sum = 0keep_adding

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赞 Tusher 10/11/2023 #7

您可以使用递归来提高效率。

这是我使用递归的解决方案:

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

评论

0赞 CtrlZ 10/18/2023
使用递归的实现可能意味着您的代码更简洁,但不一定高效
0赞 XM01 - stands with Palestine 10/17/2023 #8

您可以利用 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赞 XM01 - stands with Palestine 10/18/2023 #9

使用递归的另一种方法:

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