問1 4 の倍数の個数を数える処理の書き換え

基本情報​技術者試験 令和7年度 公開問題 科目B、全6問のうちの問1。

出典:令和7年度 基本情報技術者試験 公開問題 科目B 問1(プログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。空欄は[ a ][ b ]で、解答群の表は 1 行の文に組み直した)

次のプログラム中の[ a ]と[ b ]に入れる正しい答えの組合せを,解答群の中から選べ。

関数 function1 が受け取る引数と,関数 function2 が受け取る引数とが同じとき,二つの関数は同じ値を返す。ここで,引数 n と引数 m は正の整数であり,引数 m は引数 n よりも 1⁠0 以上大きい数とする。

〔プログラム〕
○整数型: 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
  1. アa iを1から2まで1ずつ増やす,b jをnから始めてmを超えない範囲でtempNずつ増やす
  2. イa iを1から2まで1ずつ増やす,b jをtempNからmまで1ずつ増やす
  3. ウa iを1から2まで1ずつ増やす,b jをtempNから始めてmを超えない範囲で4ずつ増やす
  4. エa iを1から3まで1ずつ増やす,b jをnから始めてmを超えない範囲でtempNずつ増やす
  5. オa iを1から3まで1ずつ増やす,b jをtempNからmまで1ずつ増やす
  6. カa iを1から3まで1ずつ増やす,b jをtempNから始めてmを超えない範囲で4ずつ増やす
答えと解説を開く

正解はカです。

function1 は、i を n から m まで 1 ずつ進め、i mod 4 が 0 になる回数、つまり 4 の倍数の個数を数えます。function2 の前半は、tempN を n から 1 ずつ増やし、4 の倍数になったら止める処理です。n を 4 で割った余りが 1 のとき、4 の倍数に届くまで 3 回足す必要があるので、a は「iを1から3まで1ずつ増やす」です。後半は、最初の 4 の倍数 tempN から 4 ずつ進めば、次の 4 の倍数を順に踏むので、b は「jをtempNから始めてmを超えない範囲で4ずつ増やす」です。n = 1、m = 1⁠1 で追います。function1 では 4 と 8 が 4 の倍数なので 2 を返します。function2 の前半は、i = 1 で tempN = 1 (1 mod 4 = 1) なので tempN ← 2、i = 2 で 2 mod 4 = 2 なので tempN ← 3、i = 3 で 3 mod 4 = 3 なので tempN ← 4 になり、繰返しが終わります。後半は j = 4、8 で count が 1、2 と増え、次の 1⁠2 は m = 1⁠1 を超えるので止まります。2 を返し、function1 と合います。n が 4 の倍数なら、前半の i = 1 で「繰返し処理を終了する」に入り、tempN = n のまま後半へ進みます。正解はカです。

ほかの選択肢が違う理由

  • アa が 2 回までだと、n = 1 のとき tempN は 3 で止まり、4 の倍数になりません。b も n から tempN ずつ進むので、n = 1、m = 1⁠1 では j = 1、4、7、1⁠0 の 4 回数え、2 と合いません。
  • イtempN が 3 で止まるうえ、b は tempN から m まで 1 ずつ進むので、4 の倍数ではない数まで数えます。n = 1、m = 1⁠1 では 3 から 1⁠1 までの 9 を返します。
  • ウ4 ずつ進む b は合っていますが、a が 2 回までなので n = 1 のとき tempN が 3 で止まります。j = 3、7、1⁠1 と 4 の倍数でない数を数えて 3 を返します。
  • エa は合っていますが、b が n から tempN ずつ進みます。n = 1、m = 1⁠1 では tempN = 4 なので j = 1、5、9 の 3 回数え、2 と合いません。
  • オa は合っていますが、b が 1 ずつ進むので、tempN から m までの全部の数を数えます。n = 1、m = 1⁠1 では 4 から 1⁠1 までの 8 を返します。

仕組み

整数を 4 で割った余りは 0、1、2、3 のどれかです。どの数から始めても、1 ずつ足せば 3 回以内に余りが 0 の数、つまり 4 の倍数に届きます。

4 の倍数は 4 つおきに並ぶので、最初の 1 つさえ見つければ、あとは 4 ずつ足して数えられます。全部の数を mod で調べるより、繰返しの回数が約 4 分の 1 で済みます。

この問に出る言葉