基本情報技術者試験 令和7年度 科目B 公開問題 問2
次のプログラム中の「 」に入れる正しい答えを、解答群の中から選べ。
関数change は、10 より大きい整数を引数n で受け取り、1 円玉、5 円玉、10 円玉を使ってちょうどn 円にする組合せの総数を返す。
例えば、12 円にする組合せは、次のように数えられる。10 円玉を使わない場合には、1 円玉と5 円玉だけでちょうど12 円にすることになる。その組合せは、使える5円玉の枚数が0 以上 (12 ÷ 5 の商) 以下なので、(12 ÷ 5 の商) + 1 = 3 通りある。同様に、10 円玉を1 枚使う場合には、1 円玉と5 円玉だけでちょうど2 円にすることになり、その組合せは (2 ÷ 5 の商) + 1 = 1 通りある。10 円玉を2 枚以上使う組合せはない。よって、1 円玉、5 円玉、10 円玉を使ってちょうど12 円にする組合せは、3 + 1 = 4 通りである。
【プログラム】 ○整数型: change(整数型: n) 整数型: count ← 0 整数型: rest ← n while (「 」) count ← count + (rest ÷ 5 の商) + 1 rest ← rest - 10 endwhile return count
選択肢を押すと答え合わせができます。
正解と解説を見る
【正解】ア
各繰返しでは、使用する10円玉の枚数を一つに固定し、残額restを1円玉と5円玉で作る組合せを数えています。rest円に使える5円玉は0枚から「rest÷5の商」枚までなので、組合せは「rest÷5の商+1」通りです。残りは全て1円玉で補えるため、restが0以上なら必ず組合せが存在します。したがって、継続条件はrest≧0です。
n=12でトレースすると、最初はrest=12で、countは0+12÷5の商+1=3となり、restは2になります。次はcountが3+2÷5の商+1=4となり、restは-8になります。ここで終了するので、10円玉が0枚の場合の3通りと、1枚の場合の1通りを正しく数えられます。
イのrest≧5は、restが0~4でも1円玉だけで作れる組合せを除外するので誤りです。ウのrest≧10は、restが0~9の有効な場合を除外します。エのrest>0は、rest=0のときの組合せを数えません。これは、例えばn=20で10円玉を2枚使う1通りを漏らします。オのrest>5は、rest=5以下を除外し、5円玉1枚又は1円玉だけで作る場合を漏らします。カのrest>10は、rest=10以下を全て除外するので誤りです。
【ポイント】 1円玉があるため、残額が非負であれば必ずちょうど支払えます。 境界値の0も有効な状態なので、「≧」と「>」の違いを確認することが重要です。
【参考】擬似言語の記述形式(基本情報技術者試験用)
擬似言語を使用した問題では、各問題文中に注記がない限り、次の記述形式が適用されているものとする。
〔擬似言語の記述形式〕 ・○手続名又は関数名 手続又は関数を宣言する。 ・型名: 変数名 変数を宣言する。 ・/* 注釈 */ 、 // 注釈 注釈を記述する。 ・変数名 ← 式 変数に式の値を代入する。 ・手続名又は関数名(引数, …) 手続又は関数を呼び出し、引数を受け渡す。
・if (条件式1) 処理1 elseif (条件式2) 処理2 elseif (条件式n) 処理n else 処理n + 1 endif 選択処理を示す。条件式を上から評価し、最初に真になった条件式に対応する処理を実行する。以降の条件式は評価せず、対応する処理も実行しない。どの条件式も真にならないときは、処理n + 1を実行する。各処理は、0以上の文の集まりである。elseifと処理の組みは、複数記述することがあり、省略することもある。elseと処理n + 1の組みは一つだけ記述し、省略することもある。
・while (条件式) 処理 endwhile 前判定繰返し処理を示す。条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・do 処理 while (条件式) 後判定繰返し処理を示す。処理を実行し、条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・for (制御記述) 処理 endfor 繰返し処理を示す。制御記述の内容に基づいて、処理を繰返し実行する。処理は、0以上の文の集まりである。
〔演算子と優先順位〕(上ほど優先度が高い) ・式:() . ・単項演算子:not + - ・二項演算子(乗除):mod × ÷ ・二項演算子(加減):+ - ・二項演算子(関係):≠ ≦ ≧ < = > ・二項演算子(論理積):and ・二項演算子(論理和):or 注記 演算子 . は、メンバ変数又はメソッドのアクセスを表す。 演算子 mod は、剰余算を表す。
〔論理型の定数〕 true, false
〔配列〕 配列の要素は、"["と"]"の間にアクセス対象要素の要素番号を指定することでアクセスする。なお、二次元配列の要素番号は、行番号、列番号の順に","で区切って指定する。 "{"は配列の内容の始まりを、"}"は配列の内容の終わりを表す。ただし、二次元配列において、内側の"{"と"}"に囲まれた部分は、1行分の内容を表す。
〔未定義、未定義の値〕 変数に値が格納されていない状態を、"未定義"という。変数に"未定義の値"を代入すると、その変数は未定義になる。
出典:令和7年度 基本情報技術者試験 科目B 公開問題 問2
※ 解説は SkillStack 編集部が作成したものです。Web 表示のため、図表の配置や表記を一部改めています。