如何保持以下程序运行,直到它成为一位数字?

时间:2014-05-06 05:00:06

标签: python python-3.x

我想编写一个程序,可以计算整数之和以及计算其数字。它会一直这样做,直到它成为一位数字。

例如,如果我输入453,则其总和将为12和数字3。 然后它将计算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 个答案:

答案 0 :(得分:0)

有一些棘手的事情需要注意。希望这段代码能让你朝着正确的方向前进。您需要对总和中剩余的位数有条件。另一件事是你需要在stringsint之间来回转换。我在此修复了while循环,但string< - > int问题仍然存在。祝你好运!

def main():

    count = 9999
    Sum = 0
    m = 0
    n = input("Please enter an integer: ")
    numList = list(n)
    while count > 1:
        count = len(numList)
        for i in numList:
            m = int(i)
            Sum = m+Sum

        print(Sum)
        print(count)
        # The following needs to be filled in.
        numlist = ???

main()

答案 1 :(得分:0)

您可以在不重复字符串解析的情况下执行此操作:

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是原始数字。

答案 2 :(得分:0)

我想赞扬this stackoverflow question以简明扼要的方式总结数字的数字,以及上面的答案,让您对解决方案有所了解。

这是我写的代码,包含函数和所有代码。理想情况下,你应该能够重用函数,这里函数digit_sum(input_number)被反复使用,直到返回值的大小(即:length,如果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

答案 3 :(得分:0)

这是使用递归函数

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)

答案 4 :(得分:0)

可能第一个诱惑就是写

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个,第二个循环一次工作一个数字。将中间级别转换为if而不是while也是有意义的,因为大多数情况下,一次处理n个数字后,结果将具有n个或更少的数字,只为第一阶段和最后阶段留下while循环。

请注意,此时的计算速度非常快,以至于Python通用开销成为最重要的部分,因此无法获得更多。

答案 5 :(得分:0)

这不是最有效的方式,但在这里并不重要;对我来说,通过递归优雅地解决这个问题:)

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

答案 6 :(得分:0)

您可以定义一个函数来查找总和,并将参数更新为最新的总和,直到您达到一位数。

def splitSum(num):
    Sum = 0
    for i in str(num):
        m = int(i)
        Sum = Sum + m

    return str(Sum)

n = input("Please enter an integer: ")
count = 0
while count != 1:
    Sum = splitSum(n)
    count = len(Sum)
    print(Sum)
    print(count)
    n = Sum