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 = 3+1 = 4)。该功能似乎适用于某些鞋带,但不适用于其他鞋带。例如:
$python csp39.py 29
返回无,但是:
$python csp39.py 30
返回 3,因为它应该...
如有任何帮助,我们将不胜感激!
请您参考如下方法:
正如其他人所提到的,问题似乎出在零件上
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)
