1

このコードの何が問題になっていますか?

import math
y=1
z=y
while z>= 1 and z<1000 :
    z= 2*y + 1
    y=y+1
    for a in range (2,int(math.sqrt(z) + 1)):
        if z%a != 0:
            print(z)
        else:
            break

ここで何が問題なのですか?出力でも合成数を取得し続けます。

4

2 に答える 2

1

ある数で割り切れなくても、別の数で割り切れる数を印刷しています。

印刷はループの外にある必要があります。

 import math
 y=1
 z=y
 while z>= 1 and z<1000 :
      z= 2*y + 1
      y=y+1
      flag=0
      for a in range (2,int(math.sqrt(z) + 1)):
          if z%a == 0:
              flag=1
              break
      if flag==0:
          print z

アルゴリズムを改善するもう 1 つの方法は、6 の倍数で移動し、効率が大幅に向上する数値を確認するmultipleofsix-1ことmultiple of six+1です。2 と 3 を除いて、他のすべての素数はその範囲で見つけることができます。

さらに改善するには、配列を維持し、以前のすべての素数を保存し、チェックしている数値の平方根以下のすべての素数で除算する必要があります。

エラトステネスやアトキンスのふるいのようなより良い即興演奏はまだありますが、これらは実装できる最も基本的なものです。

于 2013-10-05T15:17:34.130 に答える