连续数的总和

0 人关注

我必须写一个程序,要求用户输入一个极限。然后程序计算连续数字的总和(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,它就会打印出1+2+3+4+5,而它应该在5之前停止。

5 个评论
你试过什么了?忽略你其他的程序。它与你所问的问题无关。我在循环结束时给了你 num ,你不关心它来自哪里,我也不关心。
主要线索:)如果你使用 print("something", end ="") ,你可以在打印时不需要每次都换行。
有几种方法来制作这样的字符串,其中之一是在你的其他计算中建立它,例如 mystring += " +" + str(num) ,当然要相应地初始化字符串变量。
How is this different to your 最后一个问题 ?
@sayse 这次我需要实际展示计算结果。
python
loops
emt1619
emt1619
发布于 2021-12-25
6 个回答
trincot
trincot
发布于 2021-12-25
已采纳
0 人赞同

我会避免使用 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}")
    
Mark Akritas
Mark Akritas
发布于 2021-12-25
0 人赞同

我想到的一个方法是将每个迭代的值串联起来。

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]来去掉多余的+?
是的,因为你不知道哪一次迭代会是最后一次,所以最后你有一个额外的。
Glen Yu
Glen Yu
发布于 2021-12-25
0 人赞同

也许有一个更有效的方法来写这个,但这是我想到的......

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))

继续把东西放在一个列表中,然后在之后把它们连接起来。 替换代码1】必须被投到一个str的类型中,因为join只是针对字符串。

注意:输出从0开始,以考虑到limit可能是0(我不知道你的约束条件是什么,如果有的话)。

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

不需要再加上加号,可以用 " + " 连接它们。
这就对了! 谢谢!
OP并不希望从0开始直到 limit 的数字之和,而是直到这些数字的累积之和第一次大于或等于极限值。
大笑。 又对了! (读书难-_-")节日快乐
Jacob
Jacob
发布于 2021-12-25
0 人赞同

你现在/曾经非常接近。试着重新安排你的while语句中的执行顺序。我也觉得这个作业很难。试着将你的计算行移到 "while "之后的第一条语句。

按照目前的写法,你的答案是不清楚的。请 edit 添加额外的细节,以帮助其他人了解这如何解决所问的问题。你可以找到更多关于如何写好答案的信息 in the help center .
Mahad Ullah
Mahad Ullah
发布于 2021-12-25
0 人赞同

另一种方法是添加一个 if 语句。

if base< num :
   calc += f" + {num}"
    
Mohamed abdelmoula
Mohamed abdelmoula
发布于 2021-12-25
0 人赞同

下面是一个打印计算的例子

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)