2014-12-05 69 views
1

我对Python相当陌生,并且试图通过执行Project Euler问题来练习编程。为了解决7th problem,我决定首先使用for循环来构建一个简单的主要生成函数,这似乎不起作用。python中的素数生成器返回多个复合物而不是质数

这里是我的代码:

primes = [2] 

for n in range(2, 10): 
    for m in range(2, n): 
     if not(n % m): 
      primes.append(n) 

print primes 

输出是[2,4,6,6,8,8,9]什么,而不是我的本意,即[2,3,5,7]。数学似乎对我来说是正确的:选择一个自然数,n,大于2。对于大于1但小于n的所有自然数m,检查n是否可以被m整除。如果不是,则在素数列表中加n。任何人都可以告诉我我的代码有什么问题吗?

P.S.虽然我知道还有其他几种(更好的)产生素数的方法,但我有兴趣使我的方法(代码)有效。

回答

3

not(n % m)告诉你,如果一个数字是不是素数。

您还需要为每个候选因素做这件事,然后才知道数字是否为素数。

Python在for: else:中有一个非常方便的机制,如果你没有中断for,它只会运行else块。

primes = [] 
for n in range(2, 10): 
    for m in range(2, n): 
     if not(n % m): 
      break 
    else: 
     primes.append(n) 

您可以用生成器表达式类似的方式测试素性:

prime = not(any(n % m == 0 for m in range(2, n))) 

记住range是在Python 2.x的效率不高,因为它开始迭代之前生成编号的完整列表。使用xrange,除非你使用Python 3.x

+0

优秀的答案!谢谢你的帮助。 – chubbycantorset 2014-12-05 07:55:57

+0

根据您的建议,我添加了break和else语句,并将[2,3,5,5,7,7,7,7,7,9]作为输出。你知道为什么它会多次返回5和7吗? – chubbycantorset 2014-12-05 07:59:02

+0

你把其他东西放在错误的深度吗?这不是我运行我提交的确切代码时得到的输出。 – lunixbochs 2014-12-05 08:01:34

相关问题