令和7年度 基本情報技術者試験 科目B 問1の解説|同じ値を返す2つの関数

基本情報技術者試験

令和7年度 科目B 公開問題 問1擬似言語・繰返し・剰余最終更新 2026-09-04

令和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つの関数」が出たら

  1. 空欄の無いほうを先に読む。そちらが物差しです。この問題なら「n 以上 m 以下の 4 の倍数の個数」。
  2. 空欄のある for に、何をする for かの名前を付ける。ここでは「4 の倍数を探す for」と「数える for」。数えていない for があると気づけば半分終わりです。
  3. 回数は、いちばん手間がかかる場合で決める。余り 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(空欄に カ を入れたもの)


ループ開始前

いま計算していること

まだ計算していません

変数の状態

トレース表(進めると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 とびに拾います。見る回数はぐっと減って、答えは同じです。

次に読む

この記事で引用した資料

いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

「3の倍数を数える練習問題」は当サイトのオリジナルです。

Copied title and URL