在Python中求整数各位数字之和
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)