0
x=0
y = raw_input("""Up to what number would you like to locate primes?: """)
for i in range(int(y)):
x = x + 1
if x%2 and x%3 and x%5 and x%7:
print x, '--> PRIME'
elif x==2 or x==3 or x==5 or x==7:
print x, '--> PRIME'
elif x==1:
print x
else:
print x

私はこの 1 週間半ほど休憩を取っていましたが、Python の学習に時間を割こうと考えていました。私は今夜​​早く、ユーザーが指定した範囲内の整数のリストを単純に出力し、どれが素数であるかを識別するこの小さなスクリプトを書きました。私がやりたいのですが、ドキュメントが見つからないように見えるのは、スクリプトに素数の出現を数えさせ、「指定された間隔内に (空白の) 数の素数がありました」とエコーさせることです。そのようなものをどこで探すべきかわかりません。答えは欲しくありませんが、誰かに私が進むべき方向を教えてもらいたいです。

いつもありがとうございます。

PSこれはうまくいきます。私はそれを「より良く」したいだけです。

4

3 に答える 3

1

11^2 = 121 未満の数値を入力する限り、コードが機能することを指摘せざるを得ません (誤って 121 を素数と認識してしまいます)。

あなたが書いた方法は問題ありませんが、実際には Python のより強力な機能を利用していません。コードを見てみましょう:

x=0
y = raw_input("""Up to what number would you like to locate primes?: """)
for i in range(int(y)):
    x = x + 1
    if x%2 and x%3 and x%5 and x%7:
        print x, '--> PRIME'
    elif x==2 or x==3 or x==5 or x==7:
        print x, '--> PRIME'
    elif x==1:
        print x
    else:
        print x

Python では、0、1、2、...、y-1 にfor i in range(int(y))設定されます。したがって、値を追跡するためにiの変数は必要ありません。 x

y = raw_input("""Up to what number would you like to locate primes?: """)
for x in range(int(y)):
    if x%2 and x%3 and x%5 and x%7:
        print x, '--> PRIME'

Python では、 を使用inして複数の選択肢に対して等価性をすばやくテストできるため (コンテナー メンバーシップをテストする特殊なケース)、x==2 or x==3 or x==5 or x==7として書き換えることができますx in (2, 3, 5, 7)

素数の数を数えたい場合は、カウンターを追加しましょう。

num_primes = 0
y = raw_input("""Up to what number would you like to locate primes?: """)
for x in range(int(y)):
    if x == 1:
        # 1 actually passes the modulo tests and would be considered prime in the original code
        print x
    elif (x%2 and x%3 and x%5 and x%7) or x in (2, 3, 5, 7):
        num_primes += 1 # this increments num_primes by 1
        print x, '--> PRIME'
    else:
        print x

そして最後に、素敵なフォーマットのメッセージでそれを印刷します:

print 'There are {} primes between 0 and {}'.format(num_primes, y)

タダ!

于 2012-09-19T01:30:14.850 に答える
0

ある整数が素数かどうかを判断する一般的な方法は、1 からn(は問題の整数) までの各整数をループし、因数を数えることです (これはifの因数であるnことを思い出してください)。もちろん、このカウントが 2 に等しいかどうかをテストします。そうであれば素数です - そうでなければ素数ではありません。このようなもの(疑似コード):inn % i == 0nn


1 から n までのすべての i に対してcount = 0 を設定{ if (n % i is 0) then increment "count"}
if ("count" is 2) then "n" is素数

明らかにより良いアプローチがありますが、これを学んでいるだけの人にとっては十分なはずです。あなたの場合、このプロセスを範囲全体の各数値に適用し、遭遇した素数の数を数え、結果を出力したいと考えています。

そして、メモとして:言及されたコメントの1つとして、コードを適切にインデントしてください(これはPythonの必須です)。

于 2012-09-19T00:47:33.243 に答える
0

私が理解しているように、あなたは自分のアルゴリズムに満足しています (それが実際には正しくないことは明らかですが)。途中で「--> PRIME」を印刷した回数を追跡するために何を追加するかを尋ねているだけですよね?

まあ、説明は手がかりです。0 から始まるカウンター変数が必要で、'--> PRIME' を出力するたびにそのカウンターに 1 を追加します。次に、最後にそのカウンターを印刷できます。

x=0
y = raw_input("""Up to what number would you like to locate primes?: """)
primes = 0
for i in range(int(y)):
  x = x + 1
  if x%2 and x%3 and x%5 and x%7:
    print x, '--> PRIME'
    primes += 1
  elif x==2 or x==3 or x==5 or x==7:
    print x, '--> PRIME'
    primes += 1
  elif x==1:
    print x
  else:
    print x
print 'There were', primes, 'within your specified interval'

次に調べたいことは、チェックを行う関数を作成することです。次に、カウンターをインクリメントし、関数が True を返した場合に数値を出力します。

次に、関数が true を返す値だけを含む range(int(y)) を新しいリストにフィルター処理するようにコードを変更できます。それができたら、あとは結果に含まれる要素の数を数えるだけです。

次に、それをリスト内包表記として記述する方法を理解できます (これは、最初にコツをつかむのが少し難しいですが、一度理解するとコードがはるかに簡単になります)。

そして、元の明示的なリスト ビルダーをジェネレーター関数に変換したり、リスト内包表記をジェネレーター式に変換したりすることを検討してください。これにより、(ジェネレーターを反復することにより)結果が入ってくると結果を出力できますが、長さを出力して合計数を取得することはできなくなるため、別のソリューションが必要になります。

于 2012-09-19T00:51:44.507 に答える