2011-08-29 21 views
4

在Python中,有沒有一種方法可以測試一個數是否可​​以被多個數整除而不寫出每個因子的模運算?用多個數字測試整除

更具體一點,有沒有更好的方法來寫這段代碼,而不是輸入i%n == 0九十倍?

if i % 11 == 0 and i % 12 == 0 and i % 13 == 0 ... and i % 100 == 0: 
    print(i) 

謝謝!

回答

7

使用all()和發電機表達:

if all(i % n == 0 for n in range(11, 101)): 
    print(i) 
+5

哇,我們結束了與10秒差異完全相同的代碼字符 - 字符。我想這確實表明了「Python的禪宗」的一部分:「應該有一個 - 並且最好只有一個 - 明顯的方法來做到這一點。」 – icktoofay

+0

然而......我不知道是否會更快採取所有數字的乘積並檢查原始數字是否可以被*整除*,因爲它必須被它的每個因素整除,否? – geoffspear

+2

沒有。如果它可以被產品整除,那麼它可以被每個因素整除,但相反並不一定是正確的,除非你只是檢查主要因素。 – wim

3

你可以做這樣的事情:

if all(i % n == 0 for n in range(11, 101)): 
    print(i) 
3

注:這是數學的興趣,但以前的答案是在實踐中更好)

你可以計算所有除數的最小公倍數,看看這個數是不是divi由此可見。 (只是服用該產品不工作;考慮N = 16的除數4和8)

4
if all(i % n == 0 for n in reversed(xrange(11, 101))): 
    print(i) 

只有稍微修改的已經給出的重複的答案的版本:xrange返回,在生成的數字對象按需定製(比range略快,內存效率更高)。如果性能在這裏非常重要,這通常是像這樣的數學代碼片斷,那麼反向迭代器將首先檢查更大的數字。這很可能會讓你更快地從all()函數中解脫出來。

+0

+1使用'xrange',這裏肯定更好。 –

+1

對使用​​2.x的人有很好的建議,但OP使用Python 3.沒有'xrange'。 'range'現在可以做2.x中的'xrange'。不過,無論哪種方式,逆轉都是一個好主意。 –

0

以上的回答是:

if all(i % n == 0 for n in range(11, 101)): 
    print(i) 

當中,這應該澄清提到,只有內置的所有功能工作。我使用Spyder,默認情況下它使用numpy.core.fromnumeric中的all,並且上面的答案在這種情況下不起作用。然後使用以下內容:

import __builtin__ 

if __builtin__.all(i % n == 0 for n in range(11, 101)): 
    print(i)