基礎から学ぶVBAプログラミング教室

もりさんのお題を解きながら楽しく勉強しよう

スポンサーリンク

素数判定プログラムを書いてみよう①

f:id:excel-accounting:20180917233945p:plain:w500

ねぇもりさん、今日のお題はな~に?

そうだね~。じゃあ素数判定プログラムを書いてみようか。
素数は知ってるかな?

しらな~い

おーっと・・・まずはそこから説明するね!

素数とは?

素数とは、「2以上の整数」かつ「"1"と"自分自身"でしか割り切れない整数」です。

小さい順に、2,3,5,7,11,13,17・・・と続きます。


ねぇ、なんでいきなりこんなむずかしいお題なの?

最近この本読んだら面白くってさ~
現在判明している最大の素数は2324万9425けたなんだって!
神秘的よね~(ふふふ)

インターネットの暗号化技術「RSA暗号」ってのにも使われているそうですよ

って、もりさん、難しい話はそのくらいにして、授業はじめましょうか。


じゃあさっそく始めるよ~。準備はいいかな?

あれ?もりさん雰囲気かわったね

まぁね。先生モードで気合い入れてくよ~

素数判定の考え方

たとえば、「数字の9は素数であるか?」考えてみましょう。

人間は「9は3で割れるから素数ではない」とすぐに判断できますが、これをプログラムで判定するにはどうしたらいいでしょうか?

「"1"と"自分自身"でしか割り切れない整数」が素数なので、その逆を考えると、「1と9」以外の数字で割り切れなければ「素数」といえますね。

じゃあ、9÷2、9÷3、9÷4 ...って順番に割ってみればいいんだね

そのとおり!勘がいいね!
ここでVBAの割り算の演算子を3つ紹介するね

VBAの割り算演算子

① / 演算子:割り算の答えを求める
② ¥ 演算子:割り算の商を求める
③ Mod 演算子:割り算の余りを求める

【例】7 ÷ 2 の場合(3 あまり 1)
① / 演算子で得られる結果
7 / 2 → 3.5
② ¥ 演算子で得られる結果
7 ¥ 2 → 3
③ Mod 演算子で得られる結果
7 Mod 2 → 1

素数かどうかを判定するには、①~③のうち、どれを使えばよいかな?

③かな?この結果が0なら、割り切れるから素数じゃないよね

正解!
たとえば数字の9は、9 Mod 30になるね

だんだん解き方がみえてきましたね。

数字の9を、2~8で割ったときの余りを確認していきます。

つまり、9 Mod nとして、n = 2~8 を順番にあてはめてみます。

もし、9 Mod n の結果が0なら、「9はnで割り切れる」といえます。

じゃあ、ここまで書いてみようか?
割る数字は、変数のnとしておこう

は~い。Ifを使うんだよね

【VBAで書いてみよう】
もし、9がnで割り切れたら「割り切れます」と表示する。そうでなければ、「割り切れません」と表示する。

If 9 Mod n = 0 Then
MsgBox "割り切れます"
Else
MsgBox "割り切れません"
End If

おっ!If ~ Then ~ Else ステートメントの使い方は完ぺきだね~
インデントをつけようか?

インデントをつけるとは?

ステートメントの「開始」と「終了」の中身の部分を字下げ(右寄せ)して見やすくすることです

ここでは、If, Else, End If で囲われてる中身の命令部を字下げします。

Tabキーを押すと、スペース4つ分の字下げができます。

【インデントありの見本】

If 9 Mod n = 0 Then
    MsgBox "割り切れます"
Else
    MsgBox "割り切れません"
End If

は~い。たしかに見やすいね。
でもこれ、2~8までチェックするんだよね。全部で7個も書くの?

おっ、良いところ気づいたね~
For ~ Next ステートメントを紹介するね

For ~ Next ステートメントとは?

同じ処理を、指定の回数繰り返す(ループする)ときに使用します。

For カウンタ変数 = 初期値 to 終了値
(処理)
Next カウンタ変数

カウンタ変数が n, 初期値 = 2, 終了値 = 8 だから、こうなるね
変数の宣言も忘れずに!

Dim n As Long 'カウンタ変数の宣言

For n = 2 To 8
    '処理
Next n

さっき書いたIf ~ Then ~ Elseと、このFor ~ Nextを組み合わせてみようか?
実際に動かせるようにSubプロシージャにしてみよう

は~い

Sub 素数判定()

    Dim n As Long
    
    For n = 2 To 8
    
        If 9 Mod n = 0 Then
            MsgBox "割り切れます"
        Else
            MsgBox "割り切れません"
        End If
        
    Next n

End Sub

このSubプロシージャを実行すると、n = 3のとき、”割り切れます”と表示されますね。

よくできました~。インデントがあってキレイだね。
じゃあ今日はここまで!
大事なポイント4つ、しっかり復習しておくんだよ~

今日のまとめ

✔ 割り算の演算子(/ ,¥ ,Mod)
✔ インデントをつけて見やすく
✔ If ~ Then ~ Else ステートメント(条件分岐)
✔ For ~ Next ステートメント(繰り返し処理)

スポンサーリンク