2013-11-14 42 views
2
n=5;count=2;i=3;j=2; 
while (count <= n): 
    for j in range (2,i): 
      if(i%j == 0):   
       break 
    if(j==i): 
     print i 
     count = count +1 
    i = i+1 

我想找到前n个素数,但不知怎的,这段代码似乎没有编译。 该程序卡在for循环。 我曾尝试使用编写代码在C使用相同的逻辑,它似乎工作正常,但因为我需要大量支持python似乎是一个明显的选择,因此希望在python中运行。 任何帮助将是伟大的。无法找到蟒蛇中素数代码中的错误

+3

缩进在Python显著 - 应该从字面上的*第一*您了解语言的东西。 –

+0

使用有意义的变量名将使您的代码更易于阅读和理解 – hankd

+0

风格nit:摆脱'while'和'if'语句中的括号。括号是明显的C-ISM。 –

回答

6

range(a, b)a变为b-1

n=5;count=2;i=3;j=2; 
while (count <= n): 
    for j in range (2,i): 
     if(i%j == 0):   
      break 
    if(j==i-1): 
     print i 
     count = count +1 
    i = i+1 

我打赌你有

int j; 
for(j = 2; j < i; j++) { 
} 

所以由环的素数的结束,ji。当使用range时,Python不会超过限制。

+0

好抓,需要调整检查,不在范围内 – CDspace

+1

+1优秀。但是,请注意,如果您在此使用'else:',则完全取消检查。这避免了[DRYer](http://en.wikipedia.org/wiki/Don't_repeat_yourself)代码重复'i'和'j'之间的关系。 –

+0

而不是改变if语句我改变了for循环条件和程序运行得很好。感谢您的帮助 –

0

你的问题就在这里:

for j in range (2,i): 

这将检查J = 2,3,4 .... I-1。因此,你的代码在这里永远不会运行:

if(j==i): 
     print i 
     count = count +1 

所以计数永远不会改变。因此你得到一个无限的while循环。改变你的支票

if(j==i-1): 
     print i 
     count = count +1 
+1

'range(2,i + 1)'不会产生素数,因为'i'总是将'i'分开。 –

+0

好点!编辑 – hankd

+0

@PaulDraper错误。 'range(2,i + 1)'将起作用,因为'break'将总是为'prime =='发射,但是这并不重要,因为if(j == i):'成功了。如果有'else:',那么这将不起作用,但那里没有'else:',那里有一个测试。此外,[OP说](http://stackoverflow.com/questions/19982323/unable-to-find-the-mistake-in-prime-number-code-in-python/19982428#comment29748862_19982428)他们“改变了为循环条件和程序运行得很好。“。 –

0

在Python 3,这是print(),不print。代码编译时,你改变这一行:

 print(i) 

你似乎也有一个无限循环,但我会让你调试。

+1

唉......也许他在用Python 2.因为他没有提到这是一个问题。 –

+0

是的,但他做了Python 3的标记,并且这是在Python 3中唯一的编译错误(这是他声称的问题所在)。 –

1

这是一个很好的用于在循环之后关键字else:的其他模糊语法。正如其他人所评论的,您成功完成for循环的测试已关闭。

相反,尝试用else测试成功完成:

for j in range (2,i): 
     if(i%j == 0): 
      break 
else: 
    print i 
    count = count +1 
+0

如果Python有什么明显的不同,它*是* for。 。其他情况。它实际上*对你喊:“Python”;令人难以忘怀的一次。所以,“模糊”并不是我对它的感受。 :)(只是一个旁注):) –