【问题标题】:Split day-of-month integers into digits, sum them repeatedly until get a single-digit integer将月份整数拆分为数字,反复求和,直到得到一位整数
【发布时间】:2012-10-04 05:47:24
【问题描述】:

我正在尝试采用两位整数表示月份,通过将一位数中的每个字符拆分为一位数并将它们加在一起形成一个新数字。

例如如果 day 的值是整数 29,那么程序会将其转换为字符串并将它们拆分为“2”和“9”。然后程序会将 2 和 9 转换为整数并将它们加在一起等于 11。由于这仍然是一个两位数,因此程序将循环并将 1 和 1 相加,最终将打印的值为 2。根据下面的代码(主要是最后约 5 行),如果我输入 day=29,那么我不断得到的最终答案是 4,这是不正确的。有人可以帮我解决这个问题吗:

请注意,有人提到我没有重新输入 dayStringSum,我不小心删除了他们的帖子,完全不知道这意味着什么。

 dayString = str(int(day))
# Turns value day into int
dayStringA = int(str(dayString[0]))
# If day=29 then this variable represents the 2...
dayStringB = int(str(dayString[1]))
# ...and this represents the 9
dayStringSum = (dayStringA + dayStringA)
while(dayStringSum >=10):
    dayStringA = int(str(dayStringSum[0]))
# Since daystringsum is now 11, this code changes the value of daystringA into a new value of 1, likewise for below.
    dayStringB = int(str(dayStringSum[1]))

print(dayStringSum)

【问题讨论】:

  • 要获取两位数的组成位数,只需for digit in str(day)即可。这都不是dayStringA, dayStringB
  • 然后你可以将数字与day = sum(int(digit) for digit in str(day))相加。只需将其包装在一个循环中 while day >= 10: 重复求和,直到你得到一个数字。这是一条两条线。

标签: python string integer digits dayofmonth


【解决方案1】:

dayStringSum 是一个整数,所以dayStringSum[n] 没有意义。你会想先把它变成一个字符串,然后看看它的各个字符。

此外,您没有在 while 循环内为 dayStringSum 分配新值,因此如果在进入循环时它 >= 10,它将保持不变,从而导致无限循环。你说你得到了 4 的最终结果,但我根本看不到你将如何得到最终结果。

试试这样的:

daySum = int(day)  # Ensure that day is an int before we start.

while(daySum >= 10):
    newString = str(daySum)
    dayIntA = int(newString[0])
    dayIntB = int(newString[1])
    daySum = dayIntA + dayIntB  # Will be checked on next iteration.

print(daySum)

【讨论】:

  • 对于最后第二行,你的意思是 dayIntA 而不是 dayStringA,因为如果不是,那么我看不出上面的 3 个语句有什么价值?我对编程很陌生,并尽我所能。如果这看起来像是我的无知,请原谅我。
  • 是的,这正是我的意思。接得好! :-) 我现在已经编辑过了。
  • 下一个问题是指“while”中的语句所以第一行创建了一个新变量,它将daysum的值变成一个字符串。第二行和第三行拆分字符串并将其转换为整数,最后一行将整数相加并为 daysum 提供一个新值。对?如果是这样,那么我不明白的是,如果减少数字后减少的数字又是两位数,比如 12,那么程序为什么要查看 daysum 的新值(通过“while”的最后一行给出. 而不是回到“while”语句上方的语句(在我的问题中)?
  • 是的是的!我终于明白了,非常感谢。我犯了太多愚蠢的错误,把我搞砸了。该死的隧道视野。这篇文章对我最有帮助。非常感谢!
  • @user1716168 建议接受最能解决您的问题的答案(如果有的话)。 (点击绿色复选标记)
【解决方案2】:

我猜你得到错误答案的原因是你在想要添加 dayStringA + dayStringB 时添加了 dayStringA + dayStringA,也就是说,这只是一个错字。

您需要解决的另一件事是,在循环中,您不能更改 dayStringSum。到目前为止这还不是问题,因为 dayStringSum 在您的示例中小于 10,因此循环从一开始就不会执行,但是一旦您修复了该错字,您将获得一个无限循环和程序永远不会停止。

这就是我的意思:假设你的日子是29。当你到达这条线时:

while(dayStringSum >=10):

那么 dayStringSum 将是 11。那么你将 dayStringA 设置为 1,

    dayStringA= int(str(dayStringSum[0]))

还有dayStringB 到 1。

    dayStringB= int(str(dayStringSum[1]))

然后循环结束。于是 Python 又回到了这一行:

while(dayStringSum >=10):

dayStringSum 是什么?怎么,还是11点!你从来没有改变过它。所以 Python 会不断循环,一遍又一遍地执行相同的逻辑。

除此之外,还有很多事情使这段代码方式变得比它需要的复杂。我不打算通过它们(Code Review 将是那个地方),但一般来说,如果它们已经是 ints,你不需要将它们转换为 ints,同样你不需要在已经是字符串的东西上使用str

【讨论】:

  • 哇,我对循环的理解比教科书或教授解释的要好得多。非常感谢你。让我达到足够高的水平,我会回来给你+1
【解决方案3】:

试试sum(map(int,"265"))

将它们映射到整数并求和...

>>> sum(map(int,"254"))
11

>>> sum(map(int,str(29)))
11

哦,既然是作业,我真的不能直接给出答案....

但是

类似

sum1=0
for integer in [1,2,3]: sum1 += integer
print sum1

【讨论】:

  • 除了我上面所拥有的以外,我什么都不能用。我们正在学习初学者 python,我不能使用 sum 或 map。我需要集成循环。
  • 我们也不能使用 for 语句。我也不理解上面的代码图,for和in。我不是在要求答案,但我相信存在一些我无法注意到的格式错误。在过去的 4 小时里,我一直在不断更改上述内容,试图弄清楚但无济于事。
  • map(int,"265") 不如列表理解或生成器表达式 [int(digit) for digit in "265"] 更受欢迎。但无论如何,我们可以将所有这些折叠成一个生成器表达式:sum(int(digit) for digit in str(day))
  • 为什么不那么受欢迎?和谁?
【解决方案4】:

更简单的方法是取数的模数 9

>>> print(29%9)
2

【讨论】:

    【解决方案5】:
    day = 29
    
    while day >= 10:
        day = sum(int(digit) for digit in str(day))
    

    (此外,每当您对整数的各个数字进行重大操作时,decimal.Decimal 很有用,尤其是它的方法 Decimal(29).as_tuple().digits 给你(2, 9))。

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 2011-10-04
      • 2020-05-08
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      相关资源
      最近更新 更多