2014-02-08 149 views
0

問題1項目歐拉 必須返回233168 將返回266333項目歐拉#1在Python

我不希望使用不同的方法,我想知道爲什麼這個代碼不作爲是工作,從我做的調試看起來,我期望看到的所有內容都在那裏。

numArray = [] 
a = 0 
b = 0 
total = 0 
totala = 0 
totalb = 0 
#numArray a and b were for testing purposes to make sure array was correct length 
numArraya = [] 
numArrayb = [] 
while a < 1000: 
    numArray.append(a) 
    numArraya.append(a) 
    a += 3 
#expecting to get 334, returns 334 
#print (len(numArraya)) 
while b < 1000: 
    numArray.append(b) 
    numArrayb.append(b) 
    b += 5 
#expecting 200, returns 200 
#print (len(numArrayb)) 

#for numa in numArraya: 
# totala += numa 
#print (totala) 

#for numb in numArrayb: 
# totalb += numb 
#print (totalb) 

for num in numArray: 
    total += num 
print (total) 

回答

5

你的解決方案包括均爲3和5的倍數數目,兩次。你加入15,30,45,等等兩次,最後一筆:

>>> 266333 - 233168 
33165 
>>> sum(range(0, 1000, 15)) 
33165 

您的解決方案可以通過測試來固定,如果b已經存在於numArray

while b < 1000: 
    if b not in numArray: 
     numArray.append(b) 
     numArrayb.append(b) 
    b += 5 

的簡單的解決方法是從0到999循環,並用%模數運算符測試每個數字;如果結果爲0,則左側數字可以被右側參數整除。加上sum()內置的功能和發電機的表情,變成:

sum(x for x in range(1000) if x % 3 == 0 or x % 5 == 0) 

你的方法,如果投爲一組問題,是沒關係:

sum(set(range(0, 1000, 3)).union(range(0, 1000, 5))) 

兩種方法仍環,從而隨着數字的增長,需要更多的時間。然而,有一個數學解決方案需要時間不變。

請注意,您的'錯誤'提示可能的路徑;如果3的所有倍數和低於1000的5的倍數之和已經被低於1000的(3×5 == 15)的所有倍數之和所截斷,那麼如果你有一個簡單的公式來計算x下面N,則您可以通過添加的總和爲3和5和減去15.

換句話說總和計算的解決這個問題,如果f(x, n)計算x下面n所有倍數的總和,則歐拉#1的解決方案等於f(3, 1000) + f(5, 1000) - f(3 * 5, 1000)

在這種情況下,f是:

def f(x, n): 
    divisor = (n - 1) // x 
    return (divisor * x * (divisor + 1)) // 2 

給你一個直的,線性時間的結果:

>>> def f(x, n): 
...  divisor = (n - 1) // x 
...  return (divisor * x * (divisor + 1)) // 2 
... 
>>> f(3, 1000) + f(5, 1000) - f(3 * 5, 1000) 
233168 
+0

謝謝!我感到很傻,我正在用10的例子來測試它,並得到他們得到的結果,當它達到更高的數字時變得非常困惑。 – user2100714

0

見 「容斥原理」; 「FizzBu​​zz」。

我懷疑任何不喜歡歐拉工程的人都可以堅持下去。如果不清楚它有什麼好玩的地方,這裏有一個提示。如果您之前嘗試解決問題失敗,請將其作爲解決您可能需要採取不同做法的難題。

如果您仍然有點不耐煩,通常可以找出問題背後的原理。例如,當你遇到一個特定的問題時,你可能會知道整數參數和整數答案的問題稱爲「丟番圖」。你會知道變量的平方問題被稱爲「二次方」。通過搜索這些詞,你會發現問題是一個「佩爾方程」。

希望你學到很多,最重要的是,玩得開心!

0

在「正常」python沒有數組。他們被稱爲列表。要使用數組,必須安裝像numpy這樣的庫。列表根據需要調整它的長度,所以當你定義它時,你不必知道它有多大。

0

這已經有一段時間回來,但希望現在可以重新制定你的代碼到一個方便的1班輪如:

result = sum([x for x in range(1000) if (x%3==0 or x%5==0)] 

保持編碼!