【问题标题】:Sum of Digits in a specific way in PythonPython中特定方式的数字总和
【发布时间】:2020-11-21 15:02:14
【问题描述】:

我正在寻找可以运行的代码,即:

    int(input) = 2565

打印输出应该是这样的:

    2 + 5 + 6 + 5  = 18 = 1 + 8 = 9

我编写了给出最终答案“9”的代码。但我无法用每个数字分隔的“+”号来写它。假设我需要使用 while 循环,但我该如何编写代码使其与上面的输出一样?

【问题讨论】:

  • 不清楚你想要什么。那个输出打印?有无“输出=”?还是作为字符串?为什么一个等号前有两个空格?

标签: python sum digits


【解决方案1】:

你可以这样使用:

def sum_of_digits(s):
    if s < 10:
        return s
    return sum_of_digits(sum(int(c) for c in str(s)))
    
> sum_of_digits(2565)
9

它递归地检查数值是否小于 10。如果小于 10,则返回该值。如果不是,它会添加数字,然后在结果上递归调用自身。

编辑

要在执行过程中打印出步骤,您可以执行以下操作:

def sum_of_digits(s):
    if s < 10:
        print(s)
        return s
    print(' + '.join(c for c in str(s)) + ' = ')
    return sum_of_digits(sum(int(c) for c in str(s)))

【讨论】:

  • 这不正是他们已经拥有的,而不是他们想要的吗?
  • @superbrain 不确定你的意思。问题是如何对其进行编码,并且迭代字符串转换的字符是我建议的答案。
  • 他们说他们已经有了计算最终答案的代码。在我看来,他们似乎也想展示通往最终答案的道路。我现在问了一个澄清问题。
  • @superbrain 也许 OP 会在回答你的问题时澄清它。
  • 很抱歉我刚刚看到了编辑。这看起来很容易理解。谢谢你的关心。很高兴。
【解决方案2】:

首先,初始化一个空字符串output_str
当我们的整数大于 9 时,while 循环会继续:

  1. [s for s in str(x)] 将创建我们整数的数字列表(作为字符串)。它被称为list comprehension,非常有用,我的建议是阅读一下它。
  2. 使用" + ".join(),我们在 位数。在output_str 末尾添加此字符串。
  3. " = " 添加到output_str 的末尾。
  4. 计算数字的总和(我们不能使用sum(lst_of_digits),因为它是一个字符串列表。sum([int(s) for s in lst_of_digits]) 将字符串列表转换为一个inter 列表,可以使用sum() 求和)。将总和存储到x
  5. 将新的x + " = " 添加到output_string

在字符串的末尾,我们有一个多余的“=”(因为不需要最后一个 (5)),我们只需从中删除最后 3 个字符 (=)。

x = 2565
output_str = ""
while x > 9:
    lst_of_digits = [s for s in str(x)]
    output_str += " + ".join(lst_of_digits)
    output_str += " = "
    x = sum([int(s) for s in lst_of_digits])
    output_str += f"{x} = "
output_str = output_str[:-3]

输出:
output_str = '2 + 5 + 6 + 5 = 18 = 1 + 8 = 9'

【讨论】:

  • 这些分步说明非常有用。谢谢。
【解决方案3】:

您可以使用 print 函数的 end 关键字参数,它是 print 在其所有参数都被打印之后将放置的最后一个字符/字符串,默认情况下是 "\n" 但它可以改变你的愿望。

还有来自字符串的.join 方法,它将给定的字符串放在给定的字符串列表/可迭代字符串之间以获得期望的结果:

>>> " + ".join("123")
'1 + 2 + 3'
>>> 

混合在一起:

def sum_digit(n):
    s = sum(map(int,str(n)))
    print(" + ".join(str(n)),"=",s, end="")
    if s<10:
        print()
        return s
    else:
        print(" = ",end="")
        return sum_digit(s)

这里我们首先得到s上的数字之和,并根据需要打印它,end=""打印不会转到递归步骤所必需的下一行,然后我们检查是否完成,然后在这种情况下,打印一个新的空行,否则我们打印一个额外的 = 以将其绑定到下一个递归步骤

>>> sum_digit(2565)
2 + 5 + 6 + 5 = 18 = 1 + 8 = 9
9
>>> 

这可以很容易地修改为通过添加一个额外的参数或迭代来返回累积的字符串,但我将这些留给读者作为练习:)

【讨论】:

  • 这是迄今为止最清晰的解决方案,非常感谢。
  • 很高兴,如果我的或此处给出的任何其他答案解决了您的问题,请考虑接受它,以便我们知道问题已解决:)
【解决方案4】:

我是菜鸟,但这应该可以满足您的需求。

干杯, 古列尔莫

import math
import sys

def sumdigits(number):

    digits = []
    for i in range( int(math.log10(number)) + 1):
      digits.append(int(number%10))
      number = number/10

    digits.reverse()
    string = ''
    thesum = 0
    for i,x in enumerate(digits):
      string += str(x)
      thesum += x
      if i != len(digits)-1: string += ' + '
      else: string += ' = '

    if thesum > 10:
      return string,thesum,int(math.log10(number))+1
    else:
      return string,thesum,0


def main():

    number = float(sys.argv[1])
    finalstring = ''

    string,thesum,order = sumdigits(number)
    finalstring += string
    finalstring += str(thesum)
    
    while order > 0:
      finalstring += ' = '
      string,thesum,order = sumdigits(thesum)

      finalstring += string
      finalstring += str(thesum)


    print 'myinput = ',int(number)
    print 'Output = ',finalstring

if __name__ == "__main__":
    main()

【讨论】:

  • 欢迎来到 Stack Overflow!我建议您阅读How to answer a question 以提高帮助提出问题的用户的可能性。你应该解释你的方法。
  • 我刚试过这个,它给了我想要的东西。非常感谢。现在我需要一些时间来理解每一行:)
  • 要获取给定数字的所有数字,无需使用数学模块和日志,我知道您使用 log10 来获取数字的长度,但您没有不需要,因为您的数字在每次迭代中都会变小,在 while 循环中使用它作为您的控制,例如 while n&gt;0: n,digit = n//10, n%10 在这里,当 n 只是一位数字时,将它除以 10 会给您 0 并因此结束循环(@ 987654324@ 是整数除法,a//b 类似于 int(a/b) 但更好)
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多