基本情報技術者 2012年 秋期 午前(科目A) 問02
問題文
与えられた正の整数, (>)の最大公約数を、次の手順で求める。=175, =77の場合、手順(2)は何回実行するか。ここで、“A → B“は、AをBに代入することを表す。
〔手順〕
(1) 2→
(2) をで割った剰余
(3) =0ならばを最大公約数として終了する。
(4) i+ → として(2)に戻る。
選択肢
ア:3
イ:4(正解)
ウ:6
エ:7
##: 与えられた正の整数 , () の最大公約数を、次の手順で求める(, の場合)【午前2 解説】
要点まとめ
- 結論:与えられた初期値 , に対する手順(2)の実行回数は合計で 4 回であり、よって正解は イ です。
- 根拠:ユークリッドの互除法で順に余りを計算すると , , , となり、余り計算は 4 回で終了します。
- 差がつくポイント:i の初期値や「手順(2) を何回数えるか」の定義(余りを計算した回数=手順(2) の回数)に注意し、最終的に 0 を得た回まで数えることが重要です。
正解の理由
手順(2) は「 を で割った剰余」を求めて に代入する操作です。初期で i=2 として始めるため、余りを求めるたびに手順(2) が 1 回増えます。具体的計算は次の通りで、余りを求めた回数が 4 回であり、選択肢の イ が正解です。
よくある誤解
- 「最初の代入(i=2 の設定)を手順(2) の実行に含めない」:i の初期化は手順(1) であり、実際の余り計算が行われた回数を数えます。
- 「最後に最大公約数を出した時点(最後の非零余り)を数えない」:0 になった余りを作り出した手順(2) もカウントします。
- 「余りの計算順序や添字のずれ」: の添字関係を誤ると回数や値が変わるので注意が必要です。
解法ステップ
- 初期設定:, , i=2。
- 手順(2): (手順(2) 回数 = 1)。 のため継続。
- i=3:(手順(2) 回数 = 2)。 のため継続。
- i=4:(手順(2) 回数 = 3)。 のため継続。
- i=5:(手順(2) 回数 = 4)。 なので終了し、最大公約数は 。
- 結果:手順(2) の実行回数は 4 回 → 選択肢 イ。
選択肢別の誤答解説
- ア: 3 — おそらく最後に 0 を出した余りの計算()を数えていない誤りです。
- イ: 正解 — 余りを求めた回数が の 4 回であり正しいカウントです。
- ウ: 6 — 不要に追加の計算を数えたり、i の更新や初期化を複数回誤カウントした結果の過大評価です。
- エ: 7 — 余り計算以外の代入操作(i の更新など)を手順(2) の回数に含める誤りで、過剰に数えています。
補足コラム
ユークリッドの互除法では「余りを求める回数」がアルゴリズムの実行ステップ数に対応します。一般に、最悪ケースのステップ数は入力値の桁数に対して対数的で、フィボナッチ数列に近い値が与えられると多くのステップを要します。今回のように具体的に余りを順に書き出すと、誤りなく回数を数えられます。簡単なスクリプトで確認することも有効です。
def count_remainders(a, b):
count = 0
while True:
r = a % b
count += 1
if r == 0:
return count, b # (手順(2)の回数, gcd)
a, b = b, r
print(count_remainders(175, 77)) # (4, 7)
FAQ
Q1: 「手順(2) を何回」とは具体的に何を数えるのですか?
A1: を計算して に代入した回数、つまり余りを求めた回数を指します。最終的に となったその計算も含めます。
A1: を計算して に代入した回数、つまり余りを求めた回数を指します。最終的に となったその計算も含めます。
Q2: 初期値が の場合は?
A2: 操作は同様で、最初の余り計算で順序が入れ替わるだけです。余り計算を行った回数を同様に数えます。
A2: 操作は同様で、最初の余り計算で順序が入れ替わるだけです。余り計算を行った回数を同様に数えます。
Q3: 最大公約数自体はどれか?
A3: 最後に 0 になる前の (今回なら )が最大公約数です。
A3: 最後に 0 になる前の (今回なら )が最大公約数です。
関連キーワード: 最大公約数、互除法、ユークリッドの互除法、剰余、余り、GCD

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

