2010-08-13 96 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)]