2016-04-24 9 views
-1

私は素数nを計算する簡単なプログラムをまとめようとしています。私は入れ子になったforループを使ってこれをしたいと思います。一つは数字を通り、もう一つは数字をすべての数値で割って何かで割り切れるかどうかを調べることです。ループを使ってx個の素数を見つけるためのPythonコード?

私が抱えている問題は、メインforループでは、2で開始する必要があります.1がシステムを台無しにしていて、プライムと見なされたくないということです。しかし、ループが開始番号を持つためには、この例では困難である終了番号も必要とするため、ループ作業の前に必要とされる最大の素数を生成することは困難である。

ここに私が今使っているプログラムがあります。私がマークした場所は、どこかでForループの終了番号を入れる必要がある場所です。私は、Forループを完全にオープンにして、ループ自体で '1'が生成するものを単純に取り出しても、それははるかに簡単だと思うが、これは不正行為のように感じられ、正しくやりたい。あなたの助けのための

check = 0 
limit = int(input("Enter the amount of Prime Numbers")) 
for i in range(2,X): 
    check = 0 
    if i > 1: 
     for j in range(2,i): 
      if (i % j) == 0: 
       check = 1 
    if check == 0: 
     print (i) 

ありがとう!

+1

は、あなたの素数を取得するエラトステネスのふるいのようなものをない特別な理由はありますか?すべてのインデックスを実行するための内部は非常に非効率的です。 – Keiwan

+1

現時点では、これまでに生成した数を知る方法がありません。一度それをすれば、それはあなたの終わりの状態が何であるかかなり明確になるはずです。 – jonrsharpe

答えて

1

ジェネレータオブジェクトを使用して、無制限に数値を進めることができます。

あなたのコードの上部付近のどこかに、以下を挿入します。

def infinite_number_generator(initial_value=2): 
    """ Generates an infinite amount of numbers """ 
    i = initial_value 
    while True: 
     yield i 
     i += 1 

これは何それは、彼らが「降伏」どのような値にyieldの文に到達するたびに発電機を構築するための機能が、その「一時停止」オブジェクトを作成していますyieldコマンドで指定してから、yieldステートメントの次の行から実行を続けます。

Pythonの独自のrange機能は、発電機の一例そのものであり、かつほぼ同等である(ステップ引数およびその他の特殊性を無視して)

def range(start, end): 
    i = start 
    while i < end: 
     yield i 
     i += 1 

だからあなたのプログラムは次のようになります。

def infinite_number_generator(initial_value=2): 
    """ Generates an infinite amount of numbers """ 
    i = initial_value 
    while True: 
     yield i 
     i += 1 

check = 0 
limit = int(input("Enter the amount of Prime Numbers")) 
for i in infinite_number_generator(): 
    check = 0 
    for j in range(2,i): 
     if (i % j) == 0: 
      check = 1 
    if check == 0: 
     print (i) 
    if i == limit: 
     break 

あなたが提供したコードがバグであることを指摘する必要があります。limit個の素数が見つかったかどうかチェックしていないので、印刷を停止することはありません。

+0

こんにちは、このコードは、私がこの新しい目的のために働くように編集したい特定の数までのすべての素数を見つけるコードのわずかに修正されたバージョンでした。あなたが思いついたコードを修正しようとしましたが、関数がforループの外にあったため、素数のみを出力しないことを意味する素数ジェネレータとは別に続けました。現在のところ、私はループから機能したいものまで、すべてをシフトさせることなくこれを回避する方法を見つけることができません。何か案は? – Otamot1472

+0

2行目から最後の行で 'check == 0:'を 'check == 1:'に変更するとどうなりますか? :)編集:心配しないでください、それは問題ではありません。コードは私だけに素数を印刷しているようです。変数名にスペースがあるバグがありましたが、修正されました。 –

+1

私は必要に応じて動作するコードを編集できました。これはちょうど素数が印刷されるたびに増加するamountという変数を作成し、これをwhileループに追加して、この数が上限を超えないようにします。簡単なハハ。助けてくれてありがとう! – Otamot1472

0

これは、必要な操作を行う必要があります。あなたのコードで

check = 0 
limit = int(input("Enter the amount of Prime Numbers")) 
counter = 0 
i = 2 
while counter < limit: 
    check = 0 
    if i > 1: 
     for j in range(2,i): 
      if (i % j) == 0: 
       check = 1 
    if check == 0: 
     counter += 1 
     print (i) 

    i += 1 
+0

注:forループの代わりにwhileループを使うのは、forループがあなたがどれくらいのループを開始する前にカウントしてください。 (あなたがあなたの質問で「不正行為」と言っていたのであれば) – Keiwan

+0

いいえ、それは私が不正行為の意味ではなかったのですが、数字が1ならばそれを無視して境界線内ではなく、forループを開いたままにしておきます。 – Otamot1472

0

あなたは2でiを開始し、常に1ずつ増加するので、iは常に1よりも大きいままになります、したがって、テストif i > 1は無用です。 効率を上げるには、iまたはi/2の正方形でチェックを止めることができます([i/2 + 1、i []内の除数なし)。 あなたは以下のようにコードを更新することができます。

n = int(input("Enter the amount of Prime Numbers: ")) 
FoundPrimes = 0 
i = 2 
while FoundPrimes < n: 
    isPrime = True 
    for j in range(2,1 + i//2): 
     if (i % j) == 0: 
      isPrime = False 
    if isPrime: 
     FoundPrimes += 1 
     print(i, end = '\t') 
    i += 1 
+0

それはうまく動作します!ありがとう。以前のプライムの四角形を境界として使用した場合に起こりうる問題は、最終的にそれに続く数字はそれよりも大きいだろうと私は考えますか? – Otamot1472

+0

現在の番号の2乗を使用して、珍しいものではないことを確認する必要があります。 'for j in range(2,1 + i ** 0.5)' –

関連する問題