最大公約数(互除法)|擬似言語のトレース解説と練習問題

レベル:入門 / タグ:while・mod

関数 gcd は、二つの正の整数 a と b の最大公約数を返す。

プログラム

1○整数型: gcd(整数型: a, 整数型: b)
2 整数型: r
3 while (b ≠ 0)
4 r ← a mod b
5 a ← b
6 b ← r
7 endwhile
8 return a

何をしているか

ユークリッドの互除法です。「a を b で割った余り」を求め、a に b を、b に余りを入れ直すことを、b が 0 になるまで繰り返します。b が 0 になったときの a が最大公約数です。

トレースのコツ

  • 1回の繰返しで3つの代入が続きます。上から順に1行ずつ表に書きます。まとめて書くと、古い a と新しい a を取り違えます。
  • r ← a mod b の時点では、a と b はまだ前の値です。
  • 繰返しを続けるかどうかは、3つの代入が終わったあとの b で決まります。

よくある間違い

  • a ← b のあとで b ← r を計算するとき、b に新しい a を入れてしまう。r は先に求めてあるので、その値をそのまま入れます。
  • b が 0 になった回も本体を実行してしまう。while は先に条件を調べるので、b が 0 なら本体には入りません。
  • 戻り値を b(つまり 0)と答える。返すのは a です。

例題:gcd(50, 7) を最後まで追う

上のプログラムを gcd(50, 7) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。

#行したことabr
12宣言507未設定
23条件判定(真)507未設定
34代入5071
45代入771
56代入711
63条件判定(真)711
74代入710
85代入110
96代入100
103条件判定(偽)100
118戻る(1)100

この例題で問われること

問 gcd(50, 7) を呼び出したときの戻り値はどれか。

答え 1

  • 戻り値になる a は、50 → 7 → 1 と変わります。
  • 8行目で返す時点の値 1 が答えです。

問 4行目を2回目に実行した直後の、変数 r の値はどれか。

答え 0

  • 4行目は全部で2回実行されます。
  • 実行した直後の r は、順に 1 → 0 です。
  • 2回目の直後なので、答えは 0 です。

問 4行目が実行される回数はどれか。

答え 2

  • 4行目が実行されるのは、3行目の条件が真になったときだけです。
  • 3行目の条件は3回評価され、真になるのは2回です。したがって 4行目は2回実行されます。

練習問題 標準(5問)

本試験と同じくらいの量。レベル:入門

  1. 問題01 gcd(26, 14)
  2. 問題02 gcd(28, 9)
  3. 問題03 gcd(16, 12)
  4. 問題04 gcd(27, 15)
  5. 問題05 gcd(12, 10)
もっと解く(追加の10問)
  1. 問題06 gcd(23, 12)
  2. 問題07 gcd(11, 4)
  3. 問題08 gcd(16, 11)
  4. 問題09 gcd(26, 18)
  5. 問題10 gcd(24, 18)
  6. 問題11 gcd(24, 9)
  7. 問題12 gcd(22, 15)
  8. 問題13 gcd(19, 10)
  9. 問題14 gcd(20, 15)
  10. 問題15 gcd(14, 6)

練習問題 じっくり(10問)

長めのトレースで力をつける。レベル:入門

  1. 問題01 gcd(68, 35)
  2. 問題02 gcd(90, 39)
  3. 問題03 gcd(78, 56)
  4. 問題04 gcd(72, 54)
  5. 問題05 gcd(52, 28)
  6. 問題06 gcd(36, 30)
  7. 問題07 gcd(32, 24)
  8. 問題08 gcd(99, 54)
  9. 問題09 gcd(84, 49)
  10. 問題10 gcd(65, 20)
もっと解く(追加の20問)
  1. 問題11 gcd(87, 18)
  2. 問題12 gcd(24, 11)
  3. 問題13 gcd(36, 11)
  4. 問題14 gcd(74, 39)
  5. 問題15 gcd(73, 49)
  6. 問題16 gcd(87, 56)
  7. 問題17 gcd(89, 49)
  8. 問題18 gcd(99, 20)
  9. 問題19 gcd(50, 41)
  10. 問題20 gcd(46, 16)
  11. 問題21 gcd(90, 47)
  12. 問題22 gcd(86, 38)
  13. 問題23 gcd(64, 13)
  14. 問題24 gcd(79, 8)
  15. 問題25 gcd(72, 21)
  16. 問題26 gcd(78, 20)
  17. 問題27 gcd(90, 26)
  18. 問題28 gcd(66, 59)
  19. 問題29 gcd(95, 24)
  20. 問題30 gcd(79, 19)

ほかのアルゴリズム