【问题标题】:Python - Sum of numbersPython - 数字总和
【发布时间】:2010-08-13 02:09:42
【问题描述】:

我正在尝试将所有数字相加到一个范围内,所有数字都在同一范围内。

我正在使用python:

limit = 10
sums = []
for x in range(1,limit+1):
    for y in range(1,limit+1):
        sums.append(x+y)

这很好用,但是,由于嵌套循环,如果限制太大,计算总和将花费大量时间。

没有嵌套循环有没有办法做到这一点?

(这只是我为解决 ProjectEuler 问题需要做的事情的简化。它涉及获得所有丰富数的总和。)

【问题讨论】:

  • 另请参见 Python xrange,但 aaronasterling 对高斯所谓的简化的概括对于特定问题具有 O(1) 复杂性,并且 O(1)
  • @msw 我认为我们都误读了这里的问题。我已经编辑了我的回复
  • 你想要一个总和还是sums的列表

标签: python loops for-loop


【解决方案1】:
[x + y for x in xrange(limit + 1) for y in xrange(x + 1)]

这仍然执行同样多的计算,但执行速度大约是 for 循环的两倍。

from itertools import combinations

(a + b for a, b in combinations(xrange(n + 1, 2)))

这避免了很多重复的总和。我不知道你是否想跟踪这些。

如果你只想要每个总和而不表示你是如何得到它的,那么xrange(2*n + 2) 给你你想要的,没有重复或循环。

回答问题:

 [x + y for x in set set1 for y in set2]

【讨论】:

  • 如果它们是连续的数字,这会起作用吗?但是假设我有一个包含 1000 个随机数的列表,并且我想要所有这些数字的总和......有没有办法避免嵌套循环?
  • 我想这是正确的方法,但它仍然需要很长时间来计算......这仍然是 O(n^2) 的顺序吗?
  • Alex:给定 n 个随机数,在最坏的情况下会有 O(n^2) 个不同的总和。要计算所有总和,您需要一个嵌套循环或与嵌套循环一样多的工作。如果问题是速度,答案不会是以不同的方式计算那些 O(n^2) 总和;答案将是找到一个不涉及计算 O(n^2) 不同总和的解决方案。
  • 是的...这就是我开始想的...也许我应该重新考虑我的解决方案...谢谢!
【解决方案2】:

我正在尝试将所有数字相加 到一个范围,所有数字最多 范围相同。

所以你想计算limit**2 的总和。

由于嵌套循环,如果 限制太大,需要很多 是时候计算总和了。

错误:它不是“因为嵌套循环”——这是因为您正在计算一个平方数的和,因此做了一个平方数的工作。

有没有办法做到这一点 嵌套循环?

您可以屏蔽嵌套,就像@aaron 的回答一样,并且由于问题的相似性,您可以将计算的总和数量减半(尽管这与您的代码不同),但是,准备一个包含二次项的列表,绝对没有办法避免做二次项的工作。

但是,出于您声明的目的

获得所有丰富的总和 数字。

你需要无限大量的工作,因为有无穷无尽的丰富数字;-)。

我想你想到了问题 23,它实际上非常不同:它要求所有 不能 表示为 两个 丰富的数字的总和数字。你问的总结如何帮助你更接近那个解决方案真的让我无法理解。

【讨论】:

  • 感谢您的信息。我想到的唯一方法(我很确定有更好的方法:P)是生成小于 28124 的丰富数字的所有可能总和,然后迭代限制为 28124 的总和列表,附加所有未出现在答案列表总和列表中的数字。
  • @alexBrand,如果天真的蛮力解决方案足够好,欧拉项目的目的是什么?-) 当然,我不想仅仅提供解决方案就破坏您的享受,所以,只是一个提示:如果你只需要直到 N 的所有丰富数对的成对和的总和怎么办?这样计算不是更快吗?知道它对你的探索有何帮助...?
【解决方案3】:

我不确定是否有不使用嵌套循环的好方法。

如果我穿上你的鞋子,我会写如下:

[x+y for x in range(1,limit+1) for y in range(1,limit+1)]

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 2014-11-16
    • 2020-03-19
    • 1970-01-01
    • 2022-12-10
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多