アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミング初心者です。
pythonで100位内の素数を出力するコードをネットを参考に書いています。
順番に割り続けて判定する単純なやつです。
下記の場合、出力がおかしいのですが、なぜそうなるのかが分かりません。

primes = []

for n in range(2,101):
for i in range(2,n):
if n%i == 0:
break
else:
primes.append(n)
print(primes)

分かる方教えてください。

A 回答 (5件)

No.3のお礼について



私も初めて見かけたのでリンク先をパクった感じにはなってます。

内側のループでn-1までにnが割り切れてしまったら素数ではない点については理解されてますよね。
    if n%i == 0:
      break
がその部分になります。
でn-1までに割り切れることがなかったなら、素数として追加する。
  else:
    primes.append(n)
すなわちelseはif文ではなくfor文でbreakされることなくループを抜け出たnに対してリストへの追加をしています。(リンク先の受け売りです)

私もPythonはインストした程度でほとんど触ってはいないんです。
『Pythonの絵本』も途中で寝ちゃう位真面目に読み切ってなく、今回もググってみただけのものですから。
    • good
    • 0
この回答へのお礼

ご親切にありがとうございます!またわからないことあったらよろしくお願いいたします。

お礼日時:2019/11/01 16:40

No.1の理由について。



内側のループでifによって判断された際に最初の数値(2)の結果でループを抜けてしまい、n-1 まで調べなかったのが原因でしょうかね。
よく見ていなく申し訳ないです。
#print(i) は消して下さい。

そこでfor文をbreakしなかった(else:以降)数値をリストに追加していきました。
    • good
    • 0
この回答へのお礼

大変申し訳ないんですが、サルでも分かるようにもう一度解説頂けないでしょうか???

お礼日時:2019/11/01 16:15

No.2です。



primes = []

for n in range(2,101):
  for i in range(2,n):
    #print(i)
    if n%i == 0:
      break
  else:
    primes.append(n)
    
print(primes)

結果:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

https://teratail.com/questions/133434
という方法有り?
    • good
    • 0
この回答へのお礼

なるほど。確かにうまくいで動作しました、ありがとうございます!
ただ、違いが良く分からないというか、僕が書いたコードではなぜうまくいかないのでしょうか?
インデントの位置が変わるだけで、なぜこうも出力が異なるのでしょうか。。。

お礼日時:2019/11/01 15:55

No.1です。



>(iが0出ない場合)

ミスりました。

nがiで割り切れない場合

でしたね。

でも最初に 2 を追加しておいてからループに入るべきではないかな?
primes = [2]
    • good
    • 0
この回答へのお礼

ありがとうございます。
break追記すると同じ数字の繰り返しは修正できました。
ただ、そもそも素数以外がリストに追加されてしまうのはなぜでしょうか?

お礼日時:2019/11/01 14:47

primes = []



for n in range(2,101):
  for i in range(2,n):
    if n%i == 0:
      break
    else:
      primes.append(n)
      break #追記しないとnを条件不成立分(iが0出ない場合)追加し続けるから、1度追加したらループを抜ける
print(primes)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!