質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

3544閲覧

素数を判定するプログラム

YutaMoris.

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/10/09 01:18

以下のプログラムで最初の出力が2になる理由がわかりません。
最初は2%2 == 0になるから出力されないのではないのでしょうか。

def get_primes(x=2):
while True:
for i in range (2,x):
if x % i == 0:
break
else:
yield x
x += 1

i = get_primes()
for c in range(10):
print(next(i))


2
3
5
7
11
13
17
19
23
29

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

正しくインデントした場合、こうなるのですよね?

Python

1def get_primes(x=2): 2 while True: 3 for i in range (2,x): 4 if x % i == 0: 5 break 6 else: 7 yield x 8 x += 1 9 10i = get_primes() 11for c in range(10): 12 print(next(i))

既にsuyamaさんが指摘されているとおり、Pythonではインデントが重要な意味を持ちます。
インデントが崩れないよう注意して投稿してください。分からなければ聞いてください。


rangeの挙動について勘違いされているのかと思います。

Python

1>>> for i in range(2, 2): 2... print(i) 3... 4>>> for i in range(2, 3): 5... print(i) 6... 72

class range(start, stop[, step])
(中略)
step が正の場合、range r の内容は式 r[i] = start + step*i で決定されます。ここで、 i >= 0 かつ r[i] < stop です。

リファレンスより引用、太字は引用者。
つまり、ご提示のコードは、自分自身による剰余算が発生しないよう工夫されています。


print関数を適宜埋め込んで試してみるといいかと思います。

Python

1def get_primes(x=2): 2 while True: 3 print('-' * 64) 4 print('割られる数:', x) 5 for i in range (2,x): 6 print('割る数:', i) 7 if x % i == 0: 8 print(i, '割り切れた') 9 break 10 else: 11 yield x 12 x += 1 13 14i = get_primes() 15for c in range(10): 16 print(next(i), 'は素数') 17 18"""実行結果 19---------------------------------------------------------------- 20割られる数: 2 212 は素数 22---------------------------------------------------------------- 23割られる数: 3 24割る数: 2 253 は素数 26---------------------------------------------------------------- 27割られる数: 4 28割る数: 2 292 割り切れた 30---------------------------------------------------------------- 31割られる数: 5 32割る数: 2 33割る数: 3 34割る数: 4 355 は素数 36---------------------------------------------------------------- 37割られる数: 6 38割る数: 2 392 割り切れた 40---------------------------------------------------------------- 41割られる数: 7 42割る数: 2 43割る数: 3 44割る数: 4 45割る数: 5 46割る数: 6 477 は素数 48---------------------------------------------------------------- 49 50以下続く 51"""

投稿2017/10/09 02:06

編集2017/10/09 02:10
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Pythonのコードはインデントが重要な意味を持ちますので、<code>で挿入される"コードを入力"で必ず囲むようにしてください。
動作を確認し、元のコードは下記であると推測しています。

python

1def get_primes(x=2): 2 while True: 3 for i in range (2,x): 4 if x % i == 0: 5 break 6 else: 7 yield x 8 x += 1 9 10i = get_primes() 11for c in range(10): 12 print(next(i))

最初は2%2 == 0になるから出力されないのではないのでしょうか。

動作としては逆で、割った余りが0であれば素数として判定されてyieldでデータとして渡され出力されます。
xの値は初期値として引数に指定された以降は無限ループで増えていくため、同じ数値が素数として出てくることはありません。


追記:

動作を誤って認識していました。
割った余りが0であれば合成数ということですね。
2が出力される理由は、LouiS0616さんのご回答の通りです。
誤った回答をしてしまい申し訳ありません。

投稿2017/10/09 01:37

編集2017/10/09 02:49
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/10/09 02:13

素数は、約数をちょうど2つしか持たない(1と自分自身)自然数を指すので、range(2, x)の範囲では割り切れませんよ。 また、breakが実行されたときelse節は通過しません。 > 最初のスイート内で break 文が実行されると、 else 節のスイートを実行することなくループを終了します。 https://docs.python.jp/3/reference/compound_stmts.html#the-for-statement
退会済みユーザー

退会済みユーザー

2017/10/09 02:25 編集

ご指摘ありがとうございます。 コードの動作を勘違いしていました。 インデントを直す方に注力してしまって、肝心の素数判定方法を逆に取り違えてしまっていました。 break時はforのelseを実行しない点は、自分では使うことがなかったので把握していませんでした。大変参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問