0

だから私はこのコードのスニペットを持っています。そしてそれは機能します(1は素数ではないと言います):

n = 1
s = 'prime'
for i in range(2, n / 2 + 1):
    if n == 1 or n % i == 0:
        s= 'non-' +s
        break

print s

私の問題は、4 行目を : に変更するとif n % i == 0 or n == 1:、機能しないことです (1 が素数であると表示されます)。

何故ですか?私が使用してorいるので、それらのいずれかがTrueであるため、注文はカウントされませんか?

(ブール値についてはまだ学習中なので、基本的な間違いを犯している可能性があります。)

前もって感謝します!

編集:答えてくれてありがとう。私はrange()関数の問題に気づきませんでした。そして、コードが機能していて機能していないことについて: 何が起こったのかわかりません。途中でどこかで間違いを犯した可能性があります(スクリプトを実行する前に保存するのを忘れた可能性があります。ただし、別の方法で動作することを誓った可能性があります :P )。疲れてるだけなのかな…

とにかく答えてくれてありがとう!

4

5 に答える 5

2

どちらの場合も、「n」が 1 の場合、(n,n/2+1) の範囲内に収まらないため、ループの本体は実行されません。

あなたが投稿したコードは、1が素数であることを示しています(ループ本体がまったく実行されないため)

于 2010-08-23T03:39:04.030 に答える
1

問題は、n が 1 の場合、ループがスキップされることだと思います。

于 2010-08-23T03:37:39.273 に答える
1

優先度は問題ありません。%が最初に評価され、次に==、次にが評価されるため、次orのように分解されます。

     ___or___
    /        \
  ==          ==
 /  \        /  \
n    1      %    0
           / \
          n   i

あなたの問題は、forループがまったく実行されていないため、sまだ に設定されていること"prime"です。

が 1の2,n/2+1ときの範囲は、ボディが実行されない結果となる範囲です。n2,1

実際、 is 2 であり、範囲が実行されないため、 nis 2 でも実行されません。値は開始値と終了値であり、開始値と終了値ではありません-初期化のおかげで 2 が素数と見なされるのは偶然です:-)2/2+12,2s

代わりにこれを試してください:

#!usr/bin/python

n = 9
s = 'prime'
if n == 1:
    s = 'non-prime'
else:
    i = 2
    while i * i <= n:
        if n % i == 0:
            s= 'non-prime'
            break
        i = i + 1
print s

まで行くのはもったいないです。必要なn/2のは の平方根nだけです。

于 2010-08-23T03:40:09.123 に答える
1

他の回答はすでにあなたの特定の問題に正しく対処しています(つまり、ループが実行されるのn/2 + 1 > 2は、n/2 > 1新しいn > 2スタイルの分割[[python 3または将来からの適切なインポートまたはフラグ...] ]、n > 3古典的なスタイルの切り捨て分割を使用)。

あなたが提起した特定の質問を書いてください:

私が使用しているので、どちらかがTrueであるため、注文はカウントされませんか?

(like ) は短絡演算子であるため、順序カウントされます。具体的には、左から右に移動し、左のオペランドが true の場合に停止することが保証されています (右のオペランドについて知る必要がないため)。これは特定のコードには関係ありませんが、次のような場合には重要です。orandor

if i == 0 or n / i > 3: ...

左から右に移動しない (そしてできるだけ早く停止しない)場合、等しい場合orでも右側のオペランドが実行される可能性がありますが、除算によって例外が発生します! Python のルールでは、このコード スニペットは例外を発生させません (少なくとも int の場合;-)。i0i

繰り返しますが、これはあなたが抱えている特定の問題とは何の関係もありません(他の回答とこの問題の始まりを参照してください)が、将来のために知ることが重要であるため、あなたが尋ねたので、私は説明する機会を得ました!-)

于 2010-08-23T03:48:38.700 に答える
0
for n in range(101):
    s = 'prime'
    if n < 2 or not (n & 1): ## not(n & 1) == is even number (last bit 0) == not (n % 2) 
        s = 'non-'+s
    else:
        for i in range(3, int(n**0.5) + 1,2):
             if not(n % i):
                 s= 'non-' +s
                 break
    print "%i is %s" % (n,s)

すべての偶数をチェックする必要はなく、n の平方根でチェックを停止できます。

于 2010-08-23T04:06:09.770 に答える