令和7年度の科目B、その1問目です。関数が2つ、空欄も2つあって重たく見えますが、問題文が「二つの関数は同じ値を返す」と言っています。つまり片方が、もう片方の答え合わせに使える物差しです。この記事では、解答群を見る前に空欄の中身を自分で書き、最後に同じ形を探しにいきます。
出題
まず原文のまま読んでみてください。記号の読み方は次の節にまとめてありますので、読めなくてもここでは問題ありません。
出典:令和7年度 基本情報技術者試験 科目B 公開問題 問1
次のプログラム中の a と b に入れる正しい答えの組合せを,解答群の中から選べ。
関数function1 が受け取る引数と,関数function2 が受け取る引数とが同じとき,二つの関数は同じ値を返す。ここで,引数n と引数m は正の整数であり,引数m は引数n よりも10 以上大きい数とする。
〔プログラム〕
○整数型: function1(整数型: n, 整数型: m)
整数型: count ← 0
整数型: i
for (iをnからmまで1ずつ増やす)
if ((i mod 4)が0と等しい)
count ← count + 1
endif
endfor
return count
○整数型: function2(整数型: n, 整数型: m)
整数型: count ← 0
整数型: tempN ← n
整数型: i, j
for (a)
if ((tempN mod 4)が0と等しい)
繰返し処理を終了する
endif
tempN ← tempN + 1
endfor
for (b)
count ← count + 1
endfor
return count
解答群
| a | b | |
|---|---|---|
| ア | iを1から2まで1ずつ増やす | jをnから始めてmを超えない範囲でtempNずつ増やす |
| イ | iを1から2まで1ずつ増やす | jをtempNからmまで1ずつ増やす |
| ウ | iを1から2まで1ずつ増やす | jをtempNから始めてmを超えない範囲で4ずつ増やす |
| エ | iを1から3まで1ずつ増やす | jをnから始めてmを超えない範囲でtempNずつ増やす |
| オ | iを1から3まで1ずつ増やす | jをtempNからmまで1ずつ増やす |
| カ | iを1から3まで1ずつ増やす | jをtempNから始めてmを超えない範囲で4ずつ増やす |
答えだけ先に見る
正解は カ。ただし、この記事は解答群を見ずに空欄を書く順で進みます。先に式まで見てしまうと、組み立てをなぞるだけになります。
この問題に出てくる記号
読めない記号があったときだけ開いてください。先に全部読む必要はありません。
擬似言語の記号 6コ の読み方をひらく
| 書き方 | 読み方 |
|---|---|
i mod 4 |
i を 4 で割った余り。5 mod 4 は 1、8 mod 4 は 0 です。余りが 0 = 割り切れる = 4 の倍数 |
← |
左に書き込む。書かれた側の元の値は消えます |
for (i を A から B まで 1 ずつ増やす) |
i が A、A+1、… と B になるまで、くり返す回数を数える書き方 |
for (j を A から始めて B を超えない範囲で C ずつ増やす) |
j が A、A+C、A+2C、… と進み、B を超えたら回らない書き方。増やす幅を自分で決められるのがちがいです |
繰返し処理を終了する |
その for を途中で抜ける。残りの周は回りません |
return count |
count を返して終わり。呼んだ側にこの値が渡ります |
function1 は「4 の倍数の個数」を数えている
問題文が言っているのは1つだけです。「二つの関数は同じ値を返す」。つまり function2 は、function1 と同じ値を出す機械でなければいけません。先に function1 が何をしているかを読んでしまえば、それが物差しになります。
○整数型: function1(整数型: n, 整数型: m)
n と m を受け取って、整数を1つ返す
整数型: count ← 0
数えた個数。0 から始める
整数型: i
for が使う番号
for (i を n から m まで 1 ずつ増やす)
n から m まで、1つ残らず見る
if ((i mod 4) が 0 と等しい)
4 で割った余りが 0 = 4 の倍数のときだけ
count ← count + 1
1 つ数える
endif
endfor
return count
数えた個数を返す
※ 右側の注釈は当サイトで書き加えたものです。プログラム自体は原文のまま引用しています。
n から m まで1つ残らず見て、4 で割った余りが 0 のものだけ数える。つまり function1 が返すのは、n 以上 m 以下の4 の倍数の個数です。
この記事では n = 5, m = 20 を例に使います(問題文の「m は n よりも10以上大きい」を満たします)。数えてみます。
5 から 20 までの 4 の倍数(太字)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
function1(5, 20) = 4。これが物差しです。
function2 の1つ目の for を、手で動かす
function2 は for が2つに分かれています。1つ目は数えていません ── count をまったく触らず、tempN だけを動かしています。何をしているのか、n = 5 で実際に回してみます。
動かすのは、この部分だけです。
整数型: tempN ← n
for (a)
if ((tempN mod 4)が0と等しい)
繰返し処理を終了する
endif
tempN ← tempN + 1
endfor
tempN は n の写しで 5 から始まります。周の中身は「4 の倍数か判定する → そうでなければ +1 する」の順です。空欄 a が何周まわすかはまだ決まっていないので、4 の倍数に届くまで何回 +1 が要るかを数えます。
1つ目の for ── tempN を、4 の倍数に届くまで 1 ずつ進める
n = 5 のとき。tempN は変数なので、横長の箱で書いています。ここで数えているのは「+1 を何回やったか」です
① 1回目 ── tempN は 5
tempN5
5 mod 4 = 1 ── 0 ではない tempN ← 5 + 1 ── 6
4 の倍数ではないので 繰返し処理を終了する には入らず、tempN は 6 になりました。まだ 4 の倍数ではないので、もう一度。
② 2回目 ── tempN は 6
tempN6
6 mod 4 = 2 ── 0 ではない tempN ← 6 + 1 ── 7
4 の倍数ではないので 繰返し処理を終了する には入らず、tempN は 7 になりました。まだ 4 の倍数ではないので、もう一度。
③ 3回目 ── tempN は 7
tempN7
7 mod 4 = 3 ── 0 ではない tempN ← 7 + 1 ── 8
4 の倍数ではないので 繰返し処理を終了する には入らず、tempN は 8 になりました。4 の倍数に届いたので、ここから先は進める必要がありません。
for を抜けたところ
tempN8
8 mod 4 = 0
8 は 4 の倍数。n = 5 以上でいちばん小さい 4 の倍数です。1つ目の for の仕事は、これを見つけることだけでした。
+1 を 3 回 ── これで tempN = 8(n = 5 以上でいちばん小さい 4 の倍数)
1つ目の for は、n 以上でいちばん小さい 4 の倍数を探しているだけです。n = 5 のときは +1 が3回で届きました。この「3」が、あとで効きます。
コードの中で、a は「何周ためすか」、b は「何をいくつずつ数えるか」
空欄は2つとも for の括弧の中です。それぞれの for が何をする for なのかに、先に名前を付けておきます。
○整数型: function2(整数型: n, 整数型: m)
受け取るものは function1 と同じ
整数型: count ← 0
返す個数
整数型: tempN ← n
n の写し。この箱だけを動かしていく
整数型: i, j
2つの for が使う番号
for (a)
空欄a ── 1つ目の for を何周ためすか
if ((tempN mod 4) が 0 と等しい)
tempN が 4 の倍数になったか
繰返し処理を終了する
なっていたら、ここで抜ける
endif
tempN ← tempN + 1
なっていなければ、1 だけ進める
endfor
for (b)
空欄b ── 2つ目の for をどこから、いくつずつ、どこまで回すか
count ← count + 1
1周につき 1 つ数えるだけ
endfor
return count
数えた個数を返す
※ 右側の注釈は当サイトで書き加えたものです。プログラム自体は原文のまま引用しています。
空欄に入るものを決める
どちらの空欄も、さっき手を動かして分かったことがそのまま答えになります。
空欄 a ── +1 が最大で何回要るか
決めるのはこの for です(〔プログラム〕からの抜粋)
for (a)
if ((tempN mod 4)が0と等しい)
繰返し処理を終了する
endif
tempN ← tempN + 1
endfor
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
n = 5 では3周かかりました。では ほかの n ではどうか。n を 4 で割った余りで場合分けすれば、全部まとめて言えます。
n を 4 で割った余りごとに、+1 が何回要るか
1周でできる +1 は1回だけ。だから +1 が3回要るなら 3周要る
余りは 0・1・2・3 の 4通りしかない
余り 0 → もう 4 の倍数。+1 は 0 回 余り 3 → あと 1 つで届く。+1 は 1 回 余り 2 → あと 2 つ。+1 は 2 回 余り 1 → あと 3 つ。+1 は 3 回
いちばん多く要るのは余り 1 のとき ── n = 5 がこれでした。
いちばん手間がかかる余り 1 でも、+1 は3回で届きます。周の中身が「判定 → +1」なので、3周あれば足ります。
a に入るもの
i を 1 から 3 まで 1 ずつ増やす
「1 から 2 まで」では足りません。n を 4 で割った余りが 1 のときだけ +1 が3回要るからです(n = 5 なら tempN は 7 で止まり、7 は 4 の倍数ではありません)。
空欄 b ── tempN から 4 ずつ、m を超えない範囲で
決めるのはこの for です(〔プログラム〕からの抜粋)
for (b)
count ← count + 1
endfor
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
2つ目の for は、1周につき count を1つ増やすだけです。だから回った回数が、そのまま答えの個数になります。数えたいのは n 以上 m 以下の 4 の倍数でした。
そのいちばん小さいものが、いま tempN に入っています。4 の倍数は 4 とびに並んでいるので、tempN から 4 ずつ増やして、m を超えたらやめる ── これで過不足なく数えられます。
擬似言語には、それをそのまま書ける形があります ── for (j を どこから 始めて どこ を超えない範囲で いくつ ずつ増やす)。出発点・上限・とび幅の3つを自分で決められる for です。
b に入るもの
j を tempN から始めて m を超えない範囲で 4 ずつ増やす
本番の手順 ── 「同じ値を返す2つの関数」が出たら
- 空欄の無いほうを先に読む。そちらが物差しです。この問題なら「
n以上m以下の 4 の倍数の個数」。 - 空欄のある for に、何をする for かの名前を付ける。ここでは「4 の倍数を探す for」と「数える for」。数えていない for があると気づけば半分終わりです。
- 回数は、いちばん手間がかかる場合で決める。余り 0・1・2・3 の4通りを見て、最大で何回要るか。1つの例で足りると思わないこと。
ここで初めて解答群を見る
書いた式は a が「i を 1 から 3 まで 1 ずつ増やす」、b が「j を tempN から始めて m を超えない範囲で 4 ずつ増やす」。解答群でこの組合せは カ ひとつだけです。
答え合わせ ── 入れて動かすと function1 と同じ 4 が出る
空欄に カ を入れて、n = 5, m = 20 で最後まで進めます。見るのは tempN(4 の倍数を探すほう)と count(数えるほう)です。
1行ずつ追う 正解の カ(n = 5, m = 20)
出典:令和7年度 科目B 公開問題 問1(空欄に カ を入れたもの)
ループ開始前
いま計算していること
変数の状態
return で返す値
トレース表(進めると1行ずつ積み上がります)
正解は カ
a は i を 1 から 3 まで 1 ずつ増やす、b は j を tempN から始めて m を超えない範囲で 4 ずつ増やす。返り値は 4 で、function1(5, 20) と一致しました。
ほかの5つは、a が「1 から 2 まで」の3つ(ア・イ・ウ)が余り 1 のときに tempN を 4 の倍数へ届かせられず、b の「m まで1ずつ」(イ・オ)は 4 の倍数でない数まで数え、「n から tempN ずつ」(ア・エ)は始める場所も増やす幅もちがいます。なお n = 5, m = 20 ではウもたまたま 4 になります(tempN が 7 でも、7・11・15・19 で個数は同じ)── n = 1, m = 11 にするとずれます。1つの例で合っても、そこで止めないこと。
同じ考え方で解く練習問題
物差しを読んで、空欄を自分で書く手順は同じです。数える対象が 4 の倍数から 3 の倍数に変わっただけ ── 本問の答えをそのまま写すと外れます。
この練習問題は当サイトのオリジナルです(IPAの出題ではありません)。
当サイトで作った類題です
次の count3 と count3fast は、同じ引数に対して同じ値を返します(n・m は正の整数で、m は n より 10 以上大きい)。x mod 3 は x を 3 で割った余りです。空欄に入れる正しい答えはどれですか。
○整数型: count3(整数型: n, 整数型: m)
整数型: count ← 0
整数型: i
for (i を n から m まで 1 ずつ増やす)
if ((i mod 3) が 0 と等しい)
count ← count + 1
endif
endfor
return count
○整数型: count3fast(整数型: n, 整数型: m)
整数型: count ← 0
整数型: tempN ← n
整数型: i, j
for (i を 1 から 2 まで 1 ずつ増やす)
if ((tempN mod 3) が 0 と等しい)
繰返し処理を終了する
endif
tempN ← tempN + 1
endfor
for ([ ])
count ← count + 1
endfor
return count
「同じ値を返す2つの関数」の問題を見分ける
関数が2つ並んでいて「同じ値を返す」と書いてあったら、空欄の無いほうが物差しです。見つけたら、次の順で読みます。
| 見るところ | 読み取ること |
|---|---|
| 空欄の無い関数 | 何を数えているか/何を作っているかを1文で言えるまで読む。ここが決まらないと、空欄側は何も決まりません |
| 空欄のある関数の、for ごとの仕事 | 数えていない for があれば、そこは下ごしらえです(この問題なら「4 の倍数を探す」)。count を触るかどうかで見分けられます |
| くり返しの回数 | いちばん手間がかかる場合で決めます。余りがからむときは余りの通り数(4 で割るなら 0・1・2・3 の4通り)を全部並べる |
速くする書き換えは、たいてい「同じものを、飛ばしながら数える」形になります。function1 は n から m まで1つ残らず見ますが、function2 は4 の倍数だけを 4 とびに拾います。見る回数はぐっと減って、答えは同じです。
次に読む
mod の読み方に自信がなかった人へ一覧公開されている科目B の解説 ── 続けて解きたい人へこの記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
「3の倍数を数える練習問題」は当サイトのオリジナルです。

