提问人:Ariky Hito 提问时间:9/26/2023 最后编辑:Goku - stands with PalestineAriky Hito 更新时间:10/18/2023 访问量:195
如何对一个数字的数字求和,直到有一个
How to sum digits of a number untill there is one
问:
我想解决这个问题,但我不知道该怎么做
感谢您的帮助
给定 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)
答:
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..9
9
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)
,当 = 中的位数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赞
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, 36
9
9
n%9
0
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 = 0
keep_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
评论
for