基本情報科目Bサンプル問題:問4 ユークリッドの互除法を解説|最大公約数の求め方
次のプログラム中の a , b , c に入れる正しい答えの組合せを,解答群の中から選べ。
関数 gcd は,引数で与えられた二つの正の整数 num1 と num2 の最大公約数を,次の(1)~(3) の性質を利用して求める。
- (1)
num1とnum2が等しいとき,num1 と num2 の最大公約数はnum1である。 - (2)
num1がnum2より大きいとき,num1 と num2 の最大公約数は,(num1 - num2)とnum2の最大公約数と等しい。 - (3)
num2がnum1より大きいとき,num1 と num2 の最大公約数は,(num2 - num1)とnum1の最大公約数と等しい。

問題解説
この問題では、提示された3つの性質を用いて、2つの数値の最大公約数を求めるプログラムの空欄を埋めます。
1. アルゴリズムの核心:ユークリッドの互除法
この性質(大きい方から小さい方を引き続ける)は、ユークリッドの互除法(の減法バージョン)に基づいています。最終的に2つの数値が等しくなったとき、その値が最大公約数となります。
2. プログラムの動作解析
- 初期化
xにnum1を、yにnum2を代入してスタートします。 - 繰り返し条件(aの部分) 性質(1)より、
xとyが等しくなれば終了です。つまり、等しくない間はずっと処理を繰り返す必要があります。- よって、
while (x ≠ y)が入ります。
- よって、
- 条件分岐(bの部分)
xとyを比較して、大きい方から小さい方を引く処理を分岐させます。x > yであれば、xを更新 (x ← x - y)。- そうでなければ、
yを更新 (y ← y - x)。
3. 選択肢の検討
- ア・イ:
if文(条件分岐)のみ。これでは1回しか計算が行われず、数値が等しくなるまで繰り返せません。 - ウ: ループ条件は良いですが、中の条件が
x < yとなっています。これでも論理的に組めますが、解答群の組み合わせとして最も自然な構造(xが大きい時にxを引く)は「エ」になります。 - エ:
while (x ≠ y)で繰り返し、x > yの条件に応じてxまたはyを更新します。これが問題の性質 (2) と (3) を完璧に再現しています。
正解
正しい答えは エ: a=while (x ≠ y), b=x > y, c=endwhile です。
まとめ
ユークリッドの互除法は、通常「余り(モジュロ演算)」を使って一気に計算しますが、この問題のように「引き算の繰り返し」で考えるのが基本形です。ループの終了条件が「等しくなったとき」であることを押さえておきましょう!