第22回 最大公約数プログラム

プログラミング編

はじめに

マサト先生
マサト先生

やあ、こんにちは。今日は『最大公約数プログラム』を作成してみよう。

ヒロト
ヒロト

はい、よろしくお願いします。

マサト先生
マサト先生

ところでヒロトよ、最大公約数を求める最も強力な方法は何か知っているかな?

ヒロト
ヒロト

はい!それは『ユークリッド互除法』です。

マサト先生
マサト先生

うむ、流石だな。今回はそのユークリッド互除法をプログラムで書くことが目的だ。まずは復習として手計算で計算してみよう。168と324の最大公約数をユークリッド互除法で求めよう。

ユークリッド互除法

ヒロト
ヒロト

はい、手計算では次のようになります。

まず、小さい数を左、大きい数を右に並べて書きます。

ヒロト
ヒロト

次に324を168で割るのですが、商の1を324の右側に書きます。そして、普通の割り算のように余りの156を下図のように書きます。

ヒロト
ヒロト

次に168を余りの156で割ります。上と同様に商の1を168の左側に書きます。そして普通の割り算のように余りの12を下図のように書きます。

ヒロト
ヒロト

ここで、12と156が左右に並びました。これらに上とまったく同様の計算をしていきます。156を12で割ると、商が13で余りが0になります。今回はこの時点で余りが0になりました。

ヒロト
ヒロト

このように余りが0になったら、ユークリッド互除法はストップします。このとき、下図のように最大公約数は12ということになります。

マサト先生
マサト先生

うむ、完璧だ!

実際にプログラムを書くときは、余りを求めてくれる演算『%』や、『while文』をうまく使えばできるはずだ。では、頑張って書いてみよう!

ヒロト
ヒロト

はい、頑張ります!

今回は『file52』から書いていきます。

オリジナルの解答『最大公約数プログラム』


約20分後


ヒロト
ヒロト

できました!これはかなり考えました。結果は次のようになります。

ヒロト
ヒロト

これからプログラムの説明をします。

まず1,2行目で二つの正の整数をキーボードから入力します。上の例では24と36を入力しました。4行目から12行目までのif-else文は、変数Aに大きい方が代入され、変数Bに小さい方が必ず代入されるように細工しました。つまり、キーボードから二つの正の整数を代入するとき、大小関係を気にしなくていいということです。

マサト先生
マサト先生

なるほど、『最初に大きい整数を代入しなくてはいけない』というようなしばりがないというわけだな!うむ、素晴らしい工夫だ。

ヒロト
ヒロト

そして、14行目から21行目までがユークリッド互除法のプログラムです。while文の条件を『AとBが共に0に等しくない』としました。この条件を満たす限り処理はループします。その処理は大きい数Aを小さい数Bで割ってその余りをAに上書きするというものです。もし余りが0ならAはBで割り切れたということなので最大公約数Bを表示します。AをBで割った余りが0でないときは、今度はBを余りが代入されたAで割ってその余りをBに上書きします。もし余りが0ならBはAで割り切れたということなので最大公約数Aを表示します。余りが0でないならwhile文のループが繰り返されます。最終的に最大公約数が表示されたとき、AかBが0に等しくなったということなので、while文のループも終了します。

マサト先生
マサト先生

素晴らしい!感動をするレベルだぞ!

ヒロト
ヒロト

はい、ありがとうございます!

マサト先生
マサト先生

けっこう難しい問題も自分の力で考え、試行錯誤してプログラムを書けるようになってきたと思うぞ。ぜひ、今回作ったオリジナルのプログラムを大事にしてほしい。

ヒロト
ヒロト

はい、気づいたら自分で考えて書けるようになってきた感じです。

マサト先生
マサト先生

うむ、その調子で今後も頑張っていこう。では今日はお疲れさん。

ヒロト
ヒロト

はい、ありがとうございました。

コメント

タイトルとURLをコピーしました