令和7年度の科目B、その2問目です。空欄は while の条件1か所だけ。解答群も rest ≧ 0 や rest > 0 のように見た目がよく似た6つで、見比べても決まりません。この記事では、プログラムが何を場合分けしているのかを先に読み、条件を自分で書いてから解答群を見にいきます。
出題
まず原文のまま読んでみてください。記号の読み方は次の節にまとめてありますので、読めなくてもここでは問題ありません。
出典:令和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
解答群
ア rest ≧ 0イ rest ≧ 5ウ rest ≧ 10
エ rest > 0オ rest > 5カ rest > 10
答えだけ先に見る
正解は ア。ただし、この記事は解答群を見ずに条件を書く順で進みます。先に答えまで見てしまうと、組み立てをなぞるだけになります。
この問題に出てくる記号
読めない記号があったときだけ開いてください。先に全部読む必要はありません。
擬似言語の記号 7コ の読み方をひらく
| 書き方 | 読み方 |
|---|---|
○整数型: change(整数型: n) |
行頭の ○ はここから1つの関数が始まるという印。括弧の中は受け取る値(引数)の型と名前です |
rest ÷ 5 の商 |
rest を 5 で割った商(余りは捨てる)。12 ÷ 5 の商 は 2、10 ÷ 5 の商 は 2、0 ÷ 5 の商 は 0 です |
← |
左に書き込む。書かれた側の元の値は消えます |
while (条件) |
条件が成り立つあいだ、中身をくり返す。入る前に条件を見るので、はじめから成り立たなければ1回も回りません |
≧ と > |
a ≧ b は「a が b 以上」で ちょうど b のときも成り立ちます。a > b は「a が b より大きい」で、ちょうど b のときは成り立ちません |
endwhile |
while のくり返しの範囲はここまで、という印 |
return count |
count を返して終わり。呼んだ側にこの値が渡ります |
数え方は、問題文が全部書いてくれている
この問題は数え方そのものを問題文が教えています。12 円の例をなぞってみます。
問題文の数え方(12 円のとき)
10円玉 0枚 → 残り 12円 → (12 ÷ 5 の商)+ 1 = 3 通り
10円玉 1枚 → 残り 2円 → (2 ÷ 5 の商)+ 1 = 1 通り
合計 3 + 1 = 4 通り。
やっているのは、10円玉の枚数で場合分けして、それぞれの通り数を足すことだけです。そして残りを1円玉と5円玉で作る通り数は「(残り ÷ 5 の商)+ 1」 ── 5円玉の枚数を決めれば残りは1円玉で埋まるので、5円玉が何枚使えるかで決まります。
10円玉の枚数で場合分けする ── n = 20 で
問題文の 12 円では、残りが 12 → 2 と減って、ちょうど 0 にはなりません。残りがぴったり 0 になるところまで見たいので、10 で割り切れる n = 20 でやってみます。
10円玉の枚数で場合分けする(n = 20)
10円玉を 0枚 使う ── 残り 20円 を 1円玉と5円玉で
5円玉は 0・1・2・3・4 枚が使える 20 ÷ 5 の商 = 4 → 4 + 1 = 5 通り
0円・5円・10円・15円・20円ぶんの5通り。残りは1円玉で埋まります。
10円玉を 1枚 使う ── 残り 10円
5円玉は 0・1・2 枚 10 ÷ 5 の商 = 2 → 2 + 1 = 3 通り
10円玉を 2枚 使う ── 残り 0円
5円玉は 0 枚だけ 0 ÷ 5 の商 = 0 → 0 + 1 = 1 通り
残りが 0 でも 1 通りあります ── 1円玉も5円玉も0枚という組合せです。ここを数え落とすかどうかが、この問題の分かれ目になります。
10円玉を 3枚 使う ── 残り -10円
足りない → 作れない
ここまで来たら、もう先はありません。
5 + 3 + 1 = 9 通り
change(20) は 9 を返さなければいけません。見落としやすいのは3つ目 ── 残りがちょうど 0 でも 1 通りある、というところ。
コードの中で、while の条件は「場合分けをいつまで続けるか」
いま手でやった場合分けを、プログラムがどう書いているのか。注釈を付けて見ます。
○整数型: change(整数型: n)
n 円にする組合せの総数を返す
整数型: count ← 0
見つけた通り数の合計。0 から始める
整数型: rest ← n
10円玉を使ったあとの残り。はじめは10円玉が0枚なので n のまま
while ( )
空欄 ── いつまで場合分けを続けるか
count ← count + (rest ÷ 5 の商) + 1
その残りを 1円玉と5円玉だけで作る通り数を足す
rest ← rest - 10
10円玉をもう1枚使う側へ移る
endwhile
return count
合計を返す
※ 右側の注釈は当サイトで書き加えたものです。プログラム自体は原文のまま引用しています。
rest は「10円玉を使ったあとの残り」です。1周ごとに rest ← rest - 10 で 10円玉を1枚ずつ増やしていき、そのたびにその場合の通り数を足しています。手でやった表の行が1つ、ループの1周にあたります。
空欄に入るものを決める
決めるのは「どこでやめるか」だけです。手でやった表の行を、上から順に見ていきます。
続けるか、やめるか
残り 20・10 … 1円玉と5円玉で作れる → 続ける
残り 0 … 1通りある(どちらも0枚) → 続ける
残り -10 … 足りないので作れない → やめる
つまりやめるのは rest が負になったとき。裏を返せば、rest が 0 以上のあいだは続けるということです。
分かれ目は「残りがちょうど 0 の周」だけ
n = 20 の3周目。ここに入るかどうかで、答えが 9 と 8 に分かれる
残り 0 の周に入ると
rest0
count8
0 ÷ 5 の商 = 0 → 0 + 1 = 1 を足す count = 8 + 1 = 9
1通り足せます。
残り 0 の周に入らないと
rest0
count8
何も足さずに終わる count = 8
1通り数え落とします。
空欄に入るもの
while (rest ≧ 0)
本番の手順 ── くり返しの条件は「境界の1回」で決める
- 1周が何を表しているかを言う。この問題なら「10円玉を◯枚使う場合」。手でやった表の1行が、ループの1周です。
- 最後の1周を書き出す。やめる直前の周で、変数がいくつになっているか(ここでは
rest = 0)。そこを数えるべきかを、問題の意味で判断します。 - 数えるなら等号を入れる。
≧と>、≦と<のちがいは境界のその1回だけ。ほかの周では差が出ません。
ここで初めて解答群を見る
書いた条件は rest ≧ 0。解答群でこれは ア ひとつだけです。
答え合わせ ── 入れて動かすと 9 が出る
空欄に ア を入れて、n = 20 で最後まで進めます。見るのは rest(残り)と count(たまっていく通り数)です。
1行ずつ追う 正解の ア(n = 20)
出典:令和7年度 科目B 公開問題 問2(空欄に ア を入れたもの)
ループ開始前
いま計算していること
変数の状態
return で返す値
トレース表(進めると1行ずつ積み上がります)
正解は ア
while (rest ≧ 0)。返り値は 9 で、手で数えた 5 + 3 + 1 と一致しました。
ほかの5つは、どれも早く切り上げすぎます。n = 20 で回すと イ・ウ・オ・エ は 8(1通り足りない)、カ は 5。このうちエ(rest > 0)だけは、落とすのが「残りがちょうど 0 の周」1つだけで、n が 10 の倍数のときにしか差が出ません(n = 12 なら ア も エ も 4 で、区別できません)。等号のちがいは、境界がぴったり来る値でしか見えません。
同じ考え方で解く練習問題
1周が何を表しているかを読んで、境界の1回を数えるかどうかで条件を決める ── 手順は同じです。ただし1周が表すものも、比べる相手も変わっています。境界がどこに来るかは、自分で書き出して確かめてください。
この練習問題は当サイトのオリジナルです(IPAの出題ではありません)。
当サイトで作った類題です
次の change5 は、1円玉と5円玉だけを使ってちょうど n 円にする組合せの総数を返します(n は 10 より大きい整数)。five は5円玉の枚数です。空欄に入れる正しい答えはどれですか。
○整数型: change5(整数型: n)
整数型: count ← 0
整数型: five ← 0
while ([ ])
count ← count + 1
five ← five + 1
endwhile
return count
「場合分けを1本のループで回す」問題を見分ける
くり返しの中に「足す」と「進める」が並んでいたら、1周が1つの場合を表しています。見つけたら、次の順で読みます。
| 見るところ | 読み取ること |
|---|---|
| 「進める」代入 | 何を1つずつ増やしているか。rest ← rest - 10 なら10円玉の枚数です。これが場合分けの軸になります |
| 「足す」代入 | その場合が何通りあるかの式。ここが読めれば、手で数えた表がそのまま作れます |
| くり返しの条件 | 最後の1周で変数がいくつになるかを書き出し、その回を数えるべきかで等号の有無を決めます |
だから試すなら、境界がぴったり来る値を選びます(この問題なら 10 の倍数)。途中の値では、正解と誤答が同じ数になってしまいます。
次に読む
この記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
「1円玉と5円玉だけで数える練習問題」は当サイトのオリジナルです。

