繁体   English   中英

数字总和(python简单)

[英]sum digits (python simple)

我想编写一个程序来添加数字直到它变成一个数字,这是我的代码

n=int(input(""))
b=10**18
while not 1<=n<=b:
    n=int(input(""))
else: 
    tot=0
    while(n!=0):
        dig=n%10
        tot=tot+dig
        n=n//10
    s=0
    if tot>=10:
           while (tot!=0):
               tot2=tot%10
               s=s+tot2
               tot=tot//10
    else:
               s=tot    
    print(s)

我认为它可以正常工作,但是当我输入 88888888888 时,它给了我 16,因为 output 不是 7……但一切都是正确的……我该如何解决?

你可以简单地做

s = n % 9

因为从数学中我们知道,任何数字的数字之和和一个数字本身在除以 9 时具有相同的余数。唯一的极端情况是当 n 可以被 9 整除时,在这种情况下,您需要 s=9。

最终代码将是:

n=int(input())
b=10**18
while not 1 <= n <= b:
    n=int(input())
if (n%9 == 0):
    s = 9
else:
    s = n % 9

你可以递归地处理这个问题。

def sumDigits(N): return N if N<10 else sumDigits(sum(divmod(N,10)))

sumDigits(88888888888) # 7
      

如果你想要一个数学解决方案:

def sumDigits(N): return (N+8)%9+1 

问题很简单,因为您没有进行足够的迭代,正如 Daniyar Aubekerov 评论的那样,您需要 3 轮 88888888888 (88888888888->88->16->7 ) 但您只需要 2

解决它的一种方法是将公共部分分解为它们自己的函数并根据需要使用它们,例如

def digits(n):
    "digits of the number n"
    dig = []
    while n>0:
        n,d = divmod(n,10) # this do both n//10 and n%10
        dig.append(d)
    return dig

def sum_digits(n):
    s = sum(digits(n)) #sum add together all the elements in the list
    while s>10:
        s = sum(digits(s))
    return s

甚至更简单,使用更直接的方法来获取它,因为这也被称为数字的数字根

def digital_root(n):
    if n==0:
        return 0
    else:
        return 1 + (n-1)%9

和一些快速测试

>>> digits(100)
[0, 0, 1]
>>> digits(88888888888)
[8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]
>>> sum_digits(88888888888)
7
>>> digital_root(88888888888)
7
>>> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM