在Python中求整数各位数字之和

1 投票
9 回答
5195 浏览
提问于 2025-04-17 12:23
import sys

def keepsumming(number):
    numberlist = []
    for digit in str(number):
        numberlist.append(int(digit))
    total = reduce(add, numberlist)
    if total > 9:
        keepsumming(total)
    if total <= 9:
        return total

def add(x,y):
    return x+y

keepsumming(sys.argv[1])

我想创建一个函数,这个函数可以把任何数字的每个数字加起来,并且一直加,直到结果只剩下一个数字为止。比如说,1048576这个数字,先把它的每个数字相加:1+0+4+8+5+7+6,结果是31,然后再把31的数字相加:3+1,最后得到4。这个函数在某些地方能正常工作,但在其他地方却不行。例如:

$python csp39.py 29

返回的是None,但:

$python csp39.py 30

返回的是3,应该是这样的……

希望能得到一些帮助!

9 个回答

4

我很确定你需要把

if total > 9:
        keepsumming(total)

改成

if total > 9:
        return keepsumming(total)

就像大多数递归算法一样,你需要通过返回下一个调用来传递结果。

5

这里有一个非常简单的解决办法:

while number >= 10:
    number = sum(divmod(number, 10))
7

正如其他人提到的,问题似乎出在这部分

if total > 9:
    keepsumming(total)  # you need return here!

为了完整起见,我想给你展示一些例子,看看这个任务可以更优雅地解决(如果你感兴趣的话)。第一个例子也使用了字符串:

while number >= 10:
  number = sum(int(c) for c in str(number))

第二个例子使用了取模运算,这样就完全不需要字符串操作了(这应该会快很多):

while number >= 10:
  total = 0
  while number:
    number, digit = divmod(number, 10)
    total += digit
  number = total

如果你想对数字做不同的操作,也可以使用迭代器:

def digits(number, base = 10):
  while number:
    yield number % base
    number //= base

number = 12345

# sum digits
print sum(digits(number))
# multiply digits
from operator import mul
print reduce(mul, digits(number), 1)

我认为最后这个方法非常好,而且符合Python的风格。你可以用它来实现你最初的功能:

def keepsumming(number, base = 10):
  if number < base:
    return number
  return keepsumming(sum(digits(number, base)), base)

或者用迭代的方式:

def keepsumming(number, base = 10):
  while number >= base:
    number = sum(digits(number, base))

更新:感谢Karl Knechtel的提示,这实际上是一个非常简单的问题。如果好好利用基础数学,可以用一行代码解决:

def keepsumming(number, base = 10):
  return 1 + (number - 1) % (b - 1)

撰写回答