【问题标题】:The Sum of Consecutive Numbers连续数之和
【发布时间】:2022-01-25 07:03:16
【问题描述】:

我必须编写一个程序,要求用户输入一个限制。然后程序计算连续数字的总和(1 + 2 + 3 + ...),直到总和至少等于用户设置的限制。

除了结果之外,它还应该打印出执行的计算。我应该只用一个 while 循环,没有列表或 True 条件来做到这一点。

limit = int(input("Limit:"))
base = 0
num = 0
calc = " "
while base < limit:
    base += num
    num += 1
    calc += f" + {num}"
print(base)
print(f"The consecutive sum: {calc} = {base}")

因此,例如,如果输入为 10,则输出应为 10,其下方应为“连续总和:1 + 2 + 3 + 4 = 10”。如果输入为 18,则输出应为 21,其下方应为“连续总和:1 + 2 + 3 + 4 + 5 + 6 = 21。”

现在我可以让它打印最终结果(基数)并让它打印出计算,但它打印出的整数太多了。如果输入是 10,它应该在 5 之前停止时打印出 1 + 2 + 3 + 4 + 5。

【问题讨论】:

  • 你试过什么?忽略程序的其余部分。这与你问的问题无关。我在循环结束时给你num,你不在乎它来自哪里,我也不在乎。你如何打印1 + 2 + ... + num
  • 主要线索 :) 如果您使用print("something", end =""),您可以打印而无需每次都换行。
  • 有几种方法可以制作这样的字符串,其中一种是与您的其他计算一起构建它,例如mystring += " +" + str(num),当然还要相应地初始化字符串变量
  • 这与您的last question 有何不同?
  • @sayse 这次我需要实际展示计算。

标签: python loops


【解决方案1】:

我会避免使用while 循环并改用range。你可以用算术推导出最后一项的值。

如果最后一项是?,那么和will be?(?+1)/2,必须小于或等于输入限制。在给定极限的情况下,将此方程解析为 ?,我们得到 ? 为 √(1 + 8⋅limit) − 1) / 2

那么程序可以是:

limit = int(input("Limit:"))

n = int(((1 + 8 * limit) ** 0.5 - 1) / 2)

formula = " + ".join(map(str, range(1, n + 1)))
total  = n * (n + 1) // 2
print(f"The consecutive sum: {formula} = {total}")

【讨论】:

  • 优雅的解决方案,使用数学循环!
【解决方案2】:

我想到的一种方法是连接每次迭代的值:

limit = int(input("Limit:"))
base = 0
num = 1
num_total = 0
calculation = 'The consecutive sum: '
while base < limit:
    calculation += f"{num} + "
    base += num
    num += 1

print(f"{calculation[:-3]} = {base}")
print(base)

#> Limit:18
## The consecutive sum: 1 + 2 + 3 + 4 + 5 + 6 = 21
## 21

另一种方法是在每次迭代时打印值,最后没有换行(但您在此处末尾有额外的+ 符号):

limit = int(input("Limit:"))
base = 0
num = 1
num_total = 0
print('The consecutive sum: ', end='')
while base < limit:
    print(f"{num} + ", end='')
    base += num
    num += 1

print(f"= {base}")
print(base)

#> Limit:18
## The consecutive sum: 1 + 2 + 3 + 4 + 5 + 6 + = 21
## 21

【讨论】:

  • 做到了!非常感谢。我很好奇你为什么需要 [:-3] 来去掉多余的 +?
  • 是的,因为你不知道最后一个迭代是哪一个,所以最后你有一个额外的。
【解决方案3】:

可能有一种更有效的方法来写这个,但这是我想到的......

sum = 0
long_output = []

for i in range(limit + 1):
  sum += i
  long_output.append(str(i))

print("The consecutive sum: {} = {}".format(' + '.join(long_output), sum))

继续把东西放在一个列表中,然后再加入它们。 i 必须转换为 str 类型,因为 join 仅适用于字符串

注意:输出从 0 开始,说明 limit 可能为 0(我不知道您的约束是什么,如果有的话)

编辑:根据@Copperfield 的建议进行更新

【讨论】:

  • 不需要加号,你可以用" + "加入他们
  • 没错!谢谢!
  • OP 不希望从 0 到 limit 的数字总和,但直到第一次这些数字的累积总和大于或等于限制
  • 哈哈。又对了! (阅读很辛苦-_-")节日快乐!
【解决方案4】:

这是一个打印计算的例子

limit = int(input("Limit:"))
base = 0
num = 1
num_total = 0
msg = ""
while base < limit:
    msg = msg + str(num) + "+"
    base += num
    num += 1
msg =  msg[:-1] + "=" + str(limit) 
print(msg)

如果limit = 21 则输出为

1+2+3+4+5+6=21

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多