科目B
基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問4
次のプログラム中の a ~ 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 の最大公約数と等しい。
〔プログラム〕
○整数型: gcd(整数型: num1, 整数型: num2) 整数型: x ← num1 整数型: y ← num2 a if (b) x ← x - y else y ← y - x endif c return x
答えを選ぶ
出典:基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問4(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)
解説に誤りを見つけたら、解説の誤りを報告してください。
答えと解説を見る
正解:エ
覚える知識
ユークリッドの互除法のトレースと初期値関係
2数の最大公約数は、大きいほうから小さいほうを引いた差ともとの小さいほうの最大公約数に等しい。両者が等しくなるまで引き算を繰り返すと、その値が最大公約数になる。
この問題で必要なこと
性質(1)より x=y になるまで引き算を繰り返すので、if ではなく while (x≠y) にする。性質(2)より x が大きいときに x←x−y とするので、条件は x>y。正解はエ。
ひっかけ
if にすると引き算が 1 回で終わり、繰返しにならない(ア・イ)。条件を x<y にすると小さいほうから大きいほうを引いて負になり、終わらない(ウ)。