2011-07-26 22 views
2

私はいくつかのチュートリアルを使ってPythonを学習しようとしています。私は独自の演習を作成することに決めました。私は、素数の印刷だけでなく、そこにいくつの素数が1〜1000であるかを示すスクリプトを作成したかったのです。私はこれはなぜ動作しないのですか(Python)?

知らない:私は、アプリケーションを起動したときに

numberlist = [] 
a = 1 
prime = True 
while a < 1000: 
    a = a + 1 
    for divisor in range(2,a): 
     if a/divisor==int(a/divisor): 
      prime=False 
     if prime == True: 
      print a 
      numberlist.append(a) 

print "Number of prime numbers between 1 and 1000:", len(numberlist) 

しかし、それは「0 1〜1000の間の素数の数」

を返します。これは私がこれまで持っているものです私が間違ってやったこと。誰かが私が犯したことを明確にしてもらえますか?

ありがとうございました。

編集:だから今のコードは次のようになりますが、同じ問題が発生している:Aと除数の両方がint型であるため、

numberlist = [] 

a = 1 

for a in xrange(1, 1000): 
    for divisor in range(2,a): 
     if a % divisor == 0: 
      prime=False 
     else: 
      prime=True 
if prime == True: 
    print a 
    numberlist.append(a) 

print "Number of prime numbers between 1 and 1000:", len(numberlist) 
+1

はちょうどあなたが知っているように存在していることを知って、さらに仲良くときならば、あなたはかなり(numberlist'で除数のために '行うことで、このアルゴリズムを改善することができ、あなたを助けるかもしれません'a 'を2で始めるか、' numberlist [1:] 'の除数のために' 'numberlist = [1]'で始めるだけです)。 –

+1

prime = Falseの後にbreakステートメントを付けます。 – utdemir

答えて

5

このコードには多くの問題があります。最初に、a/divisor == int(a/divisor)は常にTrueです。なぜなら、Pythonでの除算は整数であるからです(常に整数結果が得られます)。代わりにa % divisor == 0を使用してください。

もう1つの問題は、prime = Trueがループの外側にあることです。つまり、1つの値がプライムではないと宣言されるとすぐに、プライムになることはありません。 (primeはどこでもTrueに戻されることはありません飽きないだろう。)

第三号様式のより多くが、Pythonでfor ... inループを使用するのが好ましいということで、例えば

for a in xrange(1, 1000): 
    for divisor in xrange(2, a): ... 

編集:あなたの変更についてコード:最後のifステートメントは字下げされていないため、ループの一部ではありません。forループが終了した後に一度だけ実行されます。つまり、primeが最後の値に設定されます(a999、素数ではありません)。 if文全体を字下げして、内部のforループに入れたいとします。あなたはしかし、これを凝縮できます

for a in xrange(1, 1000): 
    for divisor in xrange(2, a): 
     if a % divisor == 0: 
      break 
    else: 
     print a 
     numberlist.append(a) 

注これはfor ... else句を使用していること。 elseforループの最後に置くと、elseブロックはに実行されます。のループが壊れていない場合にのみ、breakによってブロックされます。

さらなるコメントとして、1でループ全体を開始すると、リストにがありますが、1 is not a primeです。

3

/除数がそう/除数== int型、int型に評価(a/divisor)は常に真です。分割後の余りをチェックしてみてください...モジュラスが...私は「除数で割った余りが、その後、ゼロであれば、」Pythonで、多分

if a % divisor == 0: 
    ... 

これは基本的に言うと思います。

+0

これはバージョン3.0で変更されています。 "1/2のような式は浮動小数点数を返します。切り捨ての動作を得るには、1/2を使用します(後者の構文は少なくともPython 2.2以降、数年前から存在していました)。" [http://www.python.org/ dev/peps/pep-0238 /](http://www.python.org/dev/peps/pep-0238/) –

3

primeTrueにリセットすることはありません。

1

の値をTrueにリセットするのを忘れたと思います。

0

それはあなたが168個の素数が1000未満

関連する問題