2017-03-16 42 views
0

我試圖找到3和5的倍數總和小於1000的總和。當我運行代碼時,我只是得到一個永不結束的0列表和它說'太多的輸出要處理'。我不知道我哪裏出錯,並會感激反饋。添加3和5的倍數小於1000

result = 0 
while result <= 1000: 
    i = 0 
    if i % 3 == 0 or i % 5 == 0: 
     print i 
     result += i 
else: 
    i += 1 

EDIT

環路復位i到0每次。這意味着它始終小於1000.

+2

你的其他人在對準的同時(這是Python中的東西),而不是如果。此外,你應該增加我每次,並開始我在循環之外。 –

回答

2

由於i未遞增,因此產生無限循環,並且result也有。

然後它歸結爲您想究竟是什麼:

總和小於1000個小於1000

result = 0 
i = 0 
while result <= 1000: 
    i += 1 
    if i % 3 == 0 or i % 5 == 0: 
     result += i 

print(result - i) 
# 998 

元素如果你指的的Euler problem,然後總和不該不低於1000,但要素:

total_sum = 0 
for i in range(1000): 
    if (i % 3 == 0 or i % 5 == 0): 
     total_sum = total_sum + i 
print total_sum 
# 233168 

另一種方法是:

sum(set(range(0,1000,3)) | set(range(0,1000,5))) 
# 233168 

或:

sum(range(0,1000,3)) + sum(range(0,1000,5)) - sum(range(0,1000,15)) 
# 233168 

+0

@ Elmex80s沒問題。布爾邏輯並不總是看起來很合邏輯:) –

+1

但你確實收到我的+1 ;-) – Elmex80s

0

你永遠不增加我。把i = 0放在循環外面,i + = 1放在循環內部。即

result = 0 
i = 0 

while result <= 1000: 
    if i % 3 == 0 or i % 5 == 0: 
     print(i) 
     result += i 
    i += 1 
+0

這是第一個歐拉問題之一,也許你應該添加它的O(1)解決方案,或者至少提到它。 AP(3,1..1000)+ AP(5,1..1000) - AP(15,1..1000) –

1

一個有趣的練習是在一個更 「Python化」 的方式來改寫這個,例如:

sum(filter(lambda x: x % 3 == 0 or x % 5 == 0, xrange(1000))) 

甚至更​​好:

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

這既給233168作爲結果。

(請注意,在這兩種情況下,sum()都是Python內置函數)。

順便說一句,在你的問題陳述中,你提到「少於1000」,但你的代碼在循環中包含1000。

+1

我不確定描述或代碼是否錯誤。 OP表示總和應該小於1000. –

+0

是的,你說得很好。我upvoted你的答案:) – UncleZeiv

0
def sum(): 
    result = 0 
    i = 0 
    # Put i=0 before loop begin 
    while result <= 1000: 
     if i % 3 == 0 or i % 5 == 0: 
      print i 
      result += i 
      i+=1 # Put i+=1 after result here 
     else: 
      i += 1 
    print ("sum= "+str(result)) 
sum() 

只是把我= 0開始循環和i +結果後= 1日前

+0

你可能想測試你的代碼,然後發佈它作爲答案。 –

+0

你會說實話,我相信這可以正常工作。 –

+0

總和是否小於1000? –

0

如果你想知道,這是一個經典的問題,我知道它從歐拉項目: https://projecteuler.net/problem=1

除了這裏給出的所有答案外,還有一個使用算術級數(https://en.wikipedia.org/wiki/Arithmetic_progression)的O(1)答案。

基本上我們需要計算3到3的最大除數小於1000的AP加上5的最大除數5的小於1000減去AP到最大除數的AP 15這是少於1000(這一步刪除itens被添加兩次,因爲它們是3和15的倍數)。

下面是代碼:

def ap(i, range_start, range_end): 
    a1 = range_start 
    an = range_end 
    n = (an - a1)/i + 1 

    return (a1 + an) * n/2 

def ap_with_limit(i, limit): 
    limit -= 1 
    return ap(i, i, limit - (limit%i)) 

print ap_with_limit(3, 1000) + ap_with_limit(5, 1000) - ap_with_limit(15, 1000) 
# 233168 
+0

@EricDuminil完成了,謝謝你的領導。 –