我想写一个程序,将数字相加,直到它成为一个单位数,这是我的代码
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作为输出而不是7…但一切都是正确的……我怎样才能解决这个问题呢?
你可以直接做
s = n % 9
因为从数学上我们知道任何数和一个数本身的数字之和除以9有相同的余数。唯一的极端情况是n能被整除,在这种情况下,你想让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
>>>