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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

2回答

196閲覧

動作が繰り返し行われない(while文)

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2018/11/21 23:12

前提・実現したいこと

偶数と素数をそれぞれ判別するプログラムを作っているのですが、whileを使うところを実行すると、期待した値が返ってきません。原因が分からず、対処に困っています。

該当のソースコード

python

1S = 12 2P = input("Please enter the number: ") 3p = int(P) 4while True: 5 if p%2 == 0: 6 p = p + 1 7 print(p) 8 break 9 elif p == 1 or 3 or 5 or 7: 10 S = S - p 11 p = p + 2 12 print(p) 13 elif p%3 != 0: 14 if p%5 != 0: 15 if p%7 != 0: 16 if p < S: 17 S = S - p 18 p = p + 2 19 print(p) 20 else: 21 S = S - 1 22 if S == 0: 23 print(p) 24 break 25 else: 26 p = p + 2 27 print(p) 28 else: 29 p = p + 2 30 print(p) 31

最初にS=12という値を作って(?)おく

  1. pを入力する(input)
  2. pが偶数か判別する(yesならp=p+1をして出力)
  3. pが偶数でない場合、素数かどうかの判別をする

...まず、pが1,3,5,7のいずれかであるかを確かめ、違った場合は次に3と5と7で割れるかを試し、もし割れなかったら素数とみなすことにしました。
4. もし素数でなかった場合、p=p+2をし、2番に戻る(偶数かどうかを判別する)
5. 素数の場合、S(=12)よりpが小さいか判別する
6. p<Sの時、S=S-p, p=p+2をし、2番に戻る
7. p>=Sの時、S=S-1をし、S=0か確かめる
8. S=0の場合、pを出力してプログラムを終了する
9. S!=0の場合、p=p+2をして2番に戻る

というようなプログラムを作りたいと思っています。
しかし、なぜか2番に戻ることができません。実行してもへんてこな値になってしまいます。
ループの使い方がなっていないため、どなたか解決策のある方にご指摘していただきたいです。

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

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

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

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

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

guest

回答2

0

直接的な原因は既にy_waiwaiさんが指摘されているように、
p == 1 or 3 or 5 or 7 が恒真式だからです。

Python

1>>> p = 42 2>>> bool(p == 1 or 3 or 5 or 7) 3True 4>>> 5>>> p = 'spam' 6>>> bool(p == 1 or 3 or 5 or 7) 7True

pが 1 もしくは 3, 5, 7 のいずれかであるという条件を書きたいなら、次のように書きます。

Python

1if p == 1 or p == 3 or p == 5 or p == 7: 2 ...

あるいは

Python

1if p in (1, 3, 5, 7): 2 ...

ただし、これらは素数判定に対しては全く無力な処理です。

pが偶数でない場合、素数かどうかの判別をする

...まず、pが1,3,5,7のいずれかであるかを確かめ、違った場合は次に3と5と7で割れるかを試し、もし割れなかったら素数とみなすことにしました。

例えば 22 は 3でも5でも7でも 割り切れませんが、素数ではありません。
素数判定用の関数を外部に切り出すのが簡単です。

Python

1def is_prime(n): 2 """nが素数ならTrue, 合成数ならFalseを返す""" 3 ...

効率を度外視すれば実装は難しくありませんので、書いてみると良いでしょう。

投稿2018/11/22 02:04

編集2018/11/22 02:06
LouiS0616

総合スコア35660

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

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

0

elif p == 1 or 3 or 5 or 7:

これは、

elif (((p == 1) or 3) or 5) or 7:

こういうことになりますが。

投稿2018/11/21 23:46

y_waiwai

総合スコア87784

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問