如何让以下程序持续运行直到变为一个单-digit 数?
我想写一个程序,可以计算一个整数的数字之和,并且还可以统计它的位数。这个程序会一直运行,直到这个数字变成一个一位数。
比如说,如果我输入453,那么它的数字之和是12,位数是3。接着它会计算12的数字之和,也就是12=1+2=3
,这个过程会一直进行,直到结果变成一位数。我完成了第一部分,但我不知道怎么用While循环让它持续运行。任何帮助都非常感谢。
def main():
Sum = 0
m = 0
n = input("Please enter an interger: ")
numList = list(n)
count = len(numList)
for i in numList:
m = int(i)
Sum = m+Sum
print(Sum)
print(count)
main()
7 个回答
我想感谢这个StackOverflow的问题,它提供了一种简洁的方法来计算一个数字的各位数字之和,还有上面的回答也给了你一些解决方案的思路。
下面是我写的代码,里面包含了一些函数。理想情况下,你应该能够重复使用这些函数。在这里,函数digit_sum(input_number)会被反复调用,直到返回值的大小(也就是如果把sum_of_digits当作字符串来看,它的长度)变成1。你可以使用while循环不断检查,直到大小符合你的要求,然后停止。
def digit_sum(input_number):
return sum(int(digit) for digit in str(input_number))
input_number = input("Please enter a number: ")
sum_of_digits = digit_sum(input_number)
while(len(str(sum_of_digits)) > 1):
sum_of_digits = digit_sum(input_number)
output = 'Sum of digits of ' + str(input_number) + ' is ' + str(sum_of_digits)
print output
input_number = sum_of_digits
你可以这样做,不需要反复解析字符串:
import math
x = 105 # or get from int(input(...))
count = 1 + int(math.log10(x))
while x >= 10:
sum = 0
for i in xrange(count):
sum += x % 10
x /= 10
x = sum
最后,x会变成一个单个数字,count则是原始数字的个数。
可能最初的想法是写
while x > 9:
x = sum(map(int, str(x)))
这句话的意思是“直到只剩一个数字为止,把x替换成它的各位数字之和”。
不过,从性能的角度来看,计算一个数字的各位数字其实是个复杂的操作,因为Python(以及一般计算机)是用二进制来存储数字的,而每提取一个数字理论上都需要进行一次取模10的运算。
所以,如果输入的不是字符串,实际上可以减少计算的次数。因为如果我们只关心最后的和(而不是中间的结果),那么各位数字相加的顺序其实并不重要。因此,可以直接计算结果,而不需要先把数字转换成字符串,然后在每次“循环”中进行处理。
while x > 9:
x = x // 10 + x % 10
从数学的角度来看,这样做的计算量大致和直接把数字转换成字符串差不多。
而且,除了只处理一个数字外,我们还可以处理更大的块,依然使用数学方法,而不进行字符串转换,比如用
while x > 99999999:
x = x // 100000000 + x % 100000000
while x > 9999:
x = x // 10000 + x % 10000
while x > 99:
x = x // 100 + x % 100
while x > 9:
x = x // 10 + x % 10
第一个循环一次处理8个数字,第二个处理4个,第三个处理2个,最后一个处理1个。把中间的处理方式改成if
而不是while
也可能更合理,因为通常在处理完n
个数字后,结果的位数会是n
或更少,这样就可以把while
循环只留给最开始和最后的阶段。
不过要注意,此时的计算速度已经非常快,以至于Python的额外开销成为了最重要的部分,因此也没法再获得太多的性能提升。
这是在使用递归函数。
def sumo(n):
sumof = 0
while n > 0:
r = n%10 #last digit
n = n/10 # quotient
sumof += r #add to sum
if sumof/10 == 0: # if no of digits in sum is only 1, then return
return sumof
elif sumof/10 > 0: #else call the function on the sumof
sumo(sumof)
这不是最有效的方法,但在这里没关系;对我来说,这是一个可以通过递归优雅地解决的问题 :)
def sum_digits(n):
n = str(n)
if int(n) < 10:
return n
else:
count = 0
for c in n:
count += int(c)
return sum_digits(count)
print sum_digits(123456789) # --> 9 # a string
稍微有点难读:
def sum_digits2(n):
if n < 10:
return n
else:
return sum_digits2(sum(int(c) for c in str(n))) # this one returns an int