今回はPythonの素数判定について見ていきましょう。
入力した任意の数が素数であるか?
数字以外を入力された時の処理はどうするのか?
入力した任意の数までに含まれる素数の数はいくつか?
繰り返し入力をして素数判定をするにはどうしたらいいのか?
と言った疑問に応えていきます。
Contents
【Python】入力した値の素数判定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
flag=True #Trueなら素数である n=int(input("値を入力してください:")) #取得した値をint型に変換 for i in range(2,n): if n%i==0: flag=False #素数である break #素数と分かればループを抜ける if flag==True: print("{}は素数です".format(n)) #ドットを忘れない if flag==False: print("{}は素数ではありません".format(n)) #ドットを忘れない |
こんな感じです。
簡単ですねwww
Pythonはインデント(字下げ)命ですので十分に注意してください。
一応Python初心者の方に向けて解説します。
素数であるかどうかの判別法
素数であるかどうかの判別法はflagに格納する値によって判断します。
- 素数である:flag=True
- 素数でない:flag=False
入力した値を数値処理できる型に変換
入力した値を格納する為に変数nを用います。
まず素数判定したい値を入力させるわけですが、str(文字列)型のままでは数値処理が出来ません。
n=input(“値を入力してください”)←このままではダメ!
なのでint(整数)型に変換しなくてはなりません。
n=int(input(“値を入力してください”))←こっちが正解!
素数判定処理のメインプログラム
素数判定したい値が決定したらいよいよ素数判定(メイン)です。
とは言っても短いコードで至極簡単なんですけどねw
そもそも素数とは1とその値自身しか約数を持たない正の整数でしたよね。
なので以下のように考えます。
素数判定したい値 n において2~(n-1)間で n の約数の有無を確認します。
まず、2~(n-1)間を繰り返す(ループ)するコードは以下になります。
(2,n)
for i in rangeもう一度確認しておきます。
(2,n)と範囲指定することで2~(n-1)までを繰り返し処理することが出来ます。
また for と in の間に i がありますよね。
i はループ処理する為の変数です。
i=2 (初期値)
i=i+1 (i=3)
i=i+1 (i=4)
・
・
<n-1回目までループは続く>
・
i=i+1 (i=n-1)
この様に値が1ループ毎に更新されていきます。
1 2 3 4 |
for i in range(2,n): if n%i==0: flag=False break |
i の値がループ処理で更新されていくと同時に、 n を i で割った余りがいくらになるのかを確認します。
条件分岐 (if)と合わせて、あまりが 0 になる場合を考えます。
つまり、こうだっ!!
if n%i==0 (もしnをiで割った余りが0ならば)
余りが0になった場合、素数ではありません(flag=False)となる。
素数判定の結果を表示する
素数判定用の変数(flag)を条件分岐に掛けて結果表示をします。
if flag==True(素数であるなら)
if flag==False (素数でないなら)
1 2 3 4 5 |
if flag==True: print("{}は素数です".format(n)) if flag==False: print("{}は素数ではありません".format(n)) |
文字や数字を表示する為には print関数 を使うことは知っていますよね?
今回は “(入力した値n)は素数~~~” と表示したいのでformat(代入したい値)を使いました。
“文字列{代入先}”.formar(代入したい値)
ソースコードの様に値の代入先を鍵括弧{} で指定して、値nを代入したいので .format(n)でnを代入。
上記の事が分からない!!少し詳しく知りたいっ!と思った方は以下の書籍の購入を検討してみて下さい。
Python初心者にとって見やすいデザインで分かりやすい説明となっています。
Python初学者にこれ以上ない優しい参考書です。
【Python】素数判定で数字以外が入力された時の処理について
さっきから気付いている人も居ると思います。
数字を入力してくれないとやばぁ~いです。
数字でもない値を int(整数)型に変換しようとしたらエラーが出てしまいます。
※因みに全角数字も通常 int型 でないので注意です。
n=”moji”が格納されている時:n=int(n)←エラー!!プログラム強制終了(中断)
このエラーを解決しない限り素数判定は出来ません!
そこで以下の様にコードを付け加えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
flag=True ############ while True: #①ループ n=input("値を入力してください:") try: n=int(n) #を整数型に変換してみる if type(n)==int: #もし正常に変換出来たら break #①ループを抜け出す except: False ############ for i in range(2,n): if n%i==0: flag=False break if flag==True: print("{}は素数です".format(n)) if flag==False: print("{}は素数ではありません".format(n)) |
要は入力(input)した値を素数判定できるように弄ることなんですよね。
数字ではなく文字などの例外が有ることですし。
さぁ、ここで付け足したコードは例外処理(try except)です。
詳しくはnote.mknk.meさんの記事から
わたくしの知識が乏しいもので上手くは説明できる訳ではありませんが、一応ね・・・説明は書いてみます。
通常正しくないコードが有るとプログラムが強制終了(中断)してしまう。
しかし、例外処理(try,except)を使用することで正しくないコードが有ったとしても処理を継続する。
勿論、この時もインデントに注意してください。
いずれにせよ、例外処理を想定したコードを付け加えたことで正しく素数判定を行うことが出来るようになりました。
変数に格納された値の型を調べる
変数 n に格納されたデータが整数型(int)か文字列型(str)そ調べたい時はtype関数を使用します。
type(変数または値)
とすることで、変数に格納されているデータ(値)の型を調べることが出来ます。
例としては以下ですね(‘ω’)ノ
1)n=”moji”の時・・・type(n)=str
2)n=10の時・・・type(n)=int
アルゴリズムなどでデータに手を加える際には、地味に覚えておかなければならない知識なので注意しましょう。
入力した任意の数までに含まれる素数の数を求める
「任意の数までに含まれる素数の数??」って思いました?
例えば、input()で整数8が入力された時:1~8までに含まれる素数は{2,3,5,7}の4つです。
こんな感じですね(-ω-)/
それでは、ソースコードを見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 |
count=0 #素数の数を格納する変数 for i in range(2,n+1): flag=True for j in range(2,i): if i%j==0: #余りが0の時=素数ではない(約数が存在する) flag=False if flag==True: #素数である時 count=count+1 print("{}までに含まれる素数の数は{}つです。".format(n,count)) |
こんな感じです。
二重ループによる処理
二重ループで条件分岐を繰り返さなければ求められないんですよねぇ~
二重ループでどのような処理をしているのかと言うと以下の表の様になっています。

例えば n=10 の時、1~10までに含まれる素数の数は{2,3,5,7}の4つとなりますよね。
これ以上の説明はあえて省きます(~_~メ)
自分なりに図や表を書いてみて考えると分かりやすいと思います。
【Python】素数判定を任意の回数繰り返す
素数判定を一回して終わり・・・なんてプログラムは何回か連続して調べたい時に面倒ですよね。
そこで任意の回数分をループできるようにコードを付けたし書き換えます。
入力の値が空白であるときにループを抜けだし終了する仕様です。
また、今までの紹介した機能をひっくるめたプログラムとしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
while True: #① flag1=True count=0 while True: #② ############# n=input("値を入力してください:") if n=="": #Enterのみを押したとき break #②のループから抜け出す ############# try: n=int(n) if type(n)==int: break except: False if n=="": #nの値が空の時 break #①のループから抜け出す→プログラム終了 flag=True ①ループ毎に初期化 for i in range(2,n): if n%i==0: flag=False for i in range(2,n+1): flag2=True for j in range(2,i): if i%j==0: flag2=False if flag2==True: count=count+1 if flag==True: print("{}は素数です".format(n)) if flag==False: print("{}は素数ではありません".format(n)) print("{}までに含まれる素数の数は{}つです。".format(n,count)) |
ループ(while)文が増えて理解が追い付かないかもしれませんね。
慣れない間は本当に分からないものです。
ループの命令をしたら繰り返し処理のスタート地点とゴール地点があります。
当たり前の事でありますが、しっかり把握していなければ上手くいきません。
【Python】まとめ
今回はPythonで素数判定をするプログラムを書きました。
この記事の内容で分からない箇所があったなら、プロゲート(progate)を利用したり参考書を調達して学習してください。

Pythonにしろ他のプログラミング言語にしろ基礎が身について居ないと後になって苦労します。
お互い頑張りましょう(-ω-)/!!
