2011-08-29 44 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)