2013-12-08 55 views
2

我需要編寫一個程序,總結所有可在100到2000範圍內除以3的整數。我甚至不知道從哪裏開始,到目前爲止我寫了一小段代碼,這是不正確的。總結範圍內的所有整數()

for x in range(100, 2001, 3): 
     print(x+x) 

任何幫助非常感謝!

+2

如果這更像是「發明一種算法」的作業,提示可能就足夠了:一個數字可以被三整除,以防單個組件總和爲可被三整除的數字(例如948可以被3整除,因爲9 + 4 + 8 = 21可以被3整除,等等)。 –

回答

6

使用發電機表達和功能在這裏:

res = sum(x for x in range(100, 2001) if x % 3 == 0) 

這是不言自明的代碼:你將所有數字從100到2000,包括在內,可以被3整除。

+2

你可以刪除'[]' - 不需要物化列表來計算總和。 – ThiefMaster

+0

@ThiefMaster所以它會成爲一個列表生成器,對吧? – aga

+0

@ThiefMaster如果它沒有實現列表,它傳遞的總和值是多少? –

0

有一個sum function

>>> sum(filter(lambda x: x % 3 == 0, range(100, 2000))) 
664650 

但是,這是更好的:

>>> sum(x for x in range(100, 2000) if x % 3 == 0) 
664650 
+3

錯誤,因爲你總結的數字不能被3整除。 –

+1

100不能被3整除,所以這是不正確的 – Max

+0

其實它沒有錯,因爲有這樣的功能。但我會編輯帖子,謝謝,我的不好 – Deck

11

既然你知道在這個範圍內的第一個數字是由3整除的是102,你可以做到以下幾點:

解決方案:

>>> sum(range(102, 2001, 3)) 
664650 

,使之成爲一個強大的功能:

def sum_range_divisible(start, end, divisor): 
    while start % divisor != 0: 
     start += 1 
    return sum(range(start, end, divisor)) 

使用它:

>>> sum_range_divisible(100, 2001, 3) 
664650 

注:

這裏的好處是,你不必檢查在全範圍內的每個數字,因爲你是3,每次跳躍。


時間:

我已經超時了不同的解決方案,礦山和aga's

>>> import timeit 
>>> timeit.Timer('sum(range(102, 2001, 3))').repeat() 
[9.516391893850312, 9.49330620765817, 9.508695564438462] 
>>> timeit.Timer('sum(x for x in range(100, 2001) if x % 3 == 0)').repeat() 
[134.757627812011, 134.46399066622394, 138.34528734198346] 

結論:

我的回答是快了的因素14

+0

對於'3'來說並不重要,但是'while start%divisor!= 0:start + = 1'對於較大的'divisor'並不好。也許'start + =(-start%abs(divisor))'。 –

+0

@InbarRose不需要我的解決方案和你的時間 - 很明顯,數字的簡單求和比遍歷比你的三倍長的範圍要快得多,只過濾那些可以被三個w/o餘數並對它們進行求和。 :)你已經想出了一個優雅的解決方案,爲此+1。 – aga

+0

@InbarRose我喜歡你的解決方案,但是aga的解決方案包含一個我打算使用的循環。 – maku

0
sum(filter(lambda l : l%3 ==0, range(100,2001))) 
+1

請不要使用lambda過濾器。代之以使用列表理解/生成器表達式更好。 – ThiefMaster

+0

我不認爲我們應該在這裏討論lambda的新章節,由於我使用它們的某些原因,關於lambda的討論已經很多。總之,請轉到此鏈接https://mail.python.org/pipermail/python-dev/2006-February/060415.html – devil00

1

這是一個封閉的公式。

如果(u_i)是由它的第一項U_0及其共同差r,則的(u_i)的n個第一項的總和所定義的序列是:

\frac{n(u_0 + u_{n-1})}{2}

編輯:我有使這個小小的video視覺解釋。

A popular anecdote將此公式歸於年輕的Johann Carl Friedrich Gauss。

在你的情況:

  • U_0 = 102
  • U_ {N-1} = 1998
  • N =(1998 - 102)/ 3 + 1 = 633

因此,總和爲(633 *(102 + 1998))/ 2 = 664650.

作爲通常的range參數的Python函數startstopstep

def arithmetic_series(start, stop, step): 
    number_of_terms = (stop - start) // step 
    sum_of_extrema = start + (stop - step) 
    return number_of_terms * sum_of_extrema // 2 

在你的情況下,呼叫將是:

arithmetic_series(102, 2001, 3) 

的複雜度爲O(1),而不是爲O(n),所以毫不奇怪:

%timeit sum(range(102, 2001, 3)) 
100000 loops, best of 3: 17.7 µs per loop 

%timeit arithmetic_series(102, 2001, 3) 
1000000 loops, best of 3: 548 ns per loop