2010-08-13 73 views
3

我想把所有的数字总和到一个范围,所有的数字都达到相同的范围。Python - 数字的总和

我使用python:

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

这一切正常,但是,因为嵌套循环的,如果限制过大,将花费大量的时间来计算的款项。

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

(这仅仅是一个的,我需要做什么来解决欧拉计划问题的东西简单化,它涉及到获得所有丰富的数字之和。)

+0

另请参见Python'xrange',但aaronasterling对高斯所谓简化的概括对于特定问题和O(1)<<< O(m * n)具有O(1)复杂性。 – msw 2010-08-13 02:14:26

+0

@msw我认为我们都在这里误解了这个问题。我编辑了我的回复 – aaronasterling 2010-08-13 02:17:18

+0

你想要一个单一的总和还是一个'总和'清单 – 2010-08-13 02:18:34

回答

2
[x + y for x in xrange(limit + 1) for y in xrange(x + 1)] 

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

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] 
+0

这将工作,如果他们连续的数字是正确的? 但是,假设我有一个1000个随机数的列表,并且我想要所有这些数字的总和......有没有办法避免嵌套循环? – AlexBrand 2010-08-13 02:21:25

+0

我想这是正确的做法,但它仍然需要很长时间来计算......这仍然是按照O(n^2)的顺序吗? – AlexBrand 2010-08-13 02:27:10

+0

亚历克斯:给定n个随机数,最坏的情况是O(n^2)个不同的总和。为了计算所有的和,你需要一个嵌套循环,或者像嵌套循环一样工作。如果问题是速度问题,答案将不会以不同的方式计算这些O(n^2)和;答案将是找到一个不涉及计算O(n^2)不同的和的解决方案。 – 2010-08-13 02:30:35

1

我想所有的数字高达 总结的范围内,所有的数字高达 相同的范围内。

所以你想计算limit**2款项。

因为嵌套循环,如果 限制过大,将采取 很多时间来计算的款项。

错误:它“因为嵌套循环” - 这是因为你的计算和的平方数,因此在做工作的二次量。

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

你可以掩盖嵌套,就像在@ aaron的回答中一样,你可以将计算的总和数减半,这是因为问题的勉强(尽管这与你的代码不一样),但是,要准备一个包含二次数项目的清单,绝对没有办法避免进行二次数量的工作。

但是,对于您的既定目的

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

你需要工作的无限量,因为有数目众多的无限;-)。

我觉得你心里有问题23,这实际上是非常不同的:它要求所有数字的总和是不能表示为丰富的数字之和。你所问的总和如何帮助你靠近那个解决方案真的逃脱了我。

+0

感谢您的信息。我想到的唯一方法(我很确定有一个更好的方法:P)是生成所有可能的小于28124的数字的总和,然后迭代总和为28124的限制列表,并追加所有没有出现在答案清单中的数字。 – AlexBrand 2010-08-13 02:31:52

+1

@alexBrand,如果天真的蛮力解决方案足够好,项目欧拉的目的是什么? - )我不想通过提供解决方案来破坏你的乐趣,当然,只是一个提示:如果你只需要所有丰富的数字对的成对总和达到N?计算速度不会更快吗?如何知道它有助于你的追求......? – 2010-08-13 02:48:35

+0

嗯!我会考虑的!非常感谢你的帮助 – AlexBrand 2010-08-13 02:58:03

0

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

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

[X + Y在范围X(1,限制+ 1)y的范围内(1,限制+ 1)]