令和7年度 基本情報技術者試験 科目B 問2の解説|while の条件に等号を入れるか

基本情報技術者試験

令和7年度 科目B 公開問題 問2擬似言語・繰返し・場合分け最終更新 2026-09-04

令和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. 1周が何を表しているかを言う。この問題なら「10円玉を◯枚使う場合」。手でやった表の1行が、ループの1周です。
  2. 最後の1周を書き出す。やめる直前の周で、変数がいくつになっているか(ここでは rest = 0)。そこを数えるべきかを、問題の意味で判断します。
  3. 数えるなら等号を入れる。≧ と >、≦ と < のちがいは境界のその1回だけ。ほかの周では差が出ません。

ここで初めて解答群を見る

書いた条件は rest ≧ 0。解答群でこれは ア ひとつだけです。

答え合わせ ── 入れて動かすと 9 が出る

空欄に ア を入れて、n = 20 で最後まで進めます。見るのは rest(残り)と count(たまっていく通り数)です。

1行ずつ追う 正解の ア(n = 20)

出典:令和7年度 科目B 公開問題 問2(空欄に ア を入れたもの)


ループ開始前

いま計算していること

まだ計算していません

変数の状態

トレース表(進めると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円玉だけで数える練習問題」は当サイトのオリジナルです。

Copied title and URL