基本情報技術者

問1

基本情報技術者試験過去問 令和7年度(2025年)科目B問1

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

関数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
    -----------

選択肢

正解と解き方・学習ポイント(AI解説)

正解:
あなたの回答:未回答

function1は、nからmまでの整数のうち、4の倍数(i mod 4 = 0)の個数を数えています。function2で同じ結果にするには、最初のfor(a)でtempNをn以上で最初の4の倍数まで1ずつ増やして合わせます。mod 4の余りは0~3なので、この調整は最大3回で済みます。次のfor(b)では、tempNからmを超えない範囲で4ずつ増やし、その回数を数える必要があります。

不正解

aが「iを1から2まで1ずつ増やす」だと、n mod 4が1の場合に2回の+1では4の倍数に到達できません(余りが3で止まります)。またbが「jをnから始めてmを超えない範囲でtempNずつ増やす」だと、増分が4ではないため、4の倍数だけを数えることになりません。よって誤りです。

不正解

aが「iを1から2まで1ずつ増やす」だと、4の倍数に合わせる調整が不足する場合があります。bが「jをtempNからmまで1ずつ増やす」だと、tempN以降のすべての整数を数えるため、4の倍数の個数になりません。よって誤りです。

不正解

bが「jをtempNから始めてmを超えない範囲で4ずつ増やす」は4の倍数を数える形としては適切です。しかしaが「iを1から2まで1ずつ増やす」だと調整が不足する場合があるため、function1と一致しません。よって誤りです。

不正解

aが「iを1から3まで1ずつ増やす」は、tempNを4の倍数に合わせるために適切です。一方、bが「jをnから始めてmを超えない範囲でtempNずつ増やす」だと増分が4に固定されず、4の倍数だけを数えることになりません。よって誤りです。

不正解

aが「iを1から3まで1ずつ増やす」は適切です。しかしbが「jをtempNからmまで1ずつ増やす」だと、4の倍数以外も数えてしまい、function1と一致しません。よって誤りです。

正解

aを「iを1から3まで1ずつ増やす」とすることで、tempNをn以上で最初の4の倍数に合わせられます。bを「jをtempNから始めてmを超えない範囲で4ずつ増やす」とすることで、4の倍数だけを数えられるため、function1と同じ戻り値になります。よって正解です。

Point

この問題は、mod演算の性質(余りが0~3になること)と、繰返し処理で数え上げる方法を用いて、同じ結果になるようにループ条件a、bを決められるかを確認します。特に、開始位置を4の倍数に合わせる処理と、4刻みで列挙して個数を数える処理を区別できることがポイントです。

解くために必要な知識

この問題を解くには、mod演算の意味と、for文の繰返し範囲の読み取りが必要です。

用語の整理

用語 意味
mod(剰余) 割り算の余りを求める演算です。例:i mod 4 = 0 ならiは4の倍数です。
for文 指定した回数、または指定した範囲で処理を繰り返します。

mod 4の性質

4で割った余りは次のいずれかです。

  • 0、1、2、3

このため、nから開始して4の倍数(余り0)に到達するまでに必要な+1の回数は最大3回です。

4の倍数の並び方

4の倍数は次のように4刻みで増えます。

  • 例:12、16、20、24、...

したがって、ある4の倍数tempNからm以下の4の倍数を数えるには、次の繰返しが基本になります。

  • jをtempNから始めてmを超えない範囲で4ずつ増やす

function1とfunction2を一致させる考え方

function2は次の2段階に分けると整理しやすいです。

  • 最初に、tempNをn以上で最初の4の倍数に合わせる

  • 次に、4ずつ増やしながら4の倍数の個数を数える

問題の解法手順

解く手順

1. function1が数えているものを確認する

nからmまでの各iについて、i mod 4 = 0のときだけcountを1増やしています。
したがって、function1の戻り値は次の個数です。

  • n以上m以下の整数のうち4の倍数の個数

2. function2の最初のfor(a)の役割を確認する

tempNはnから始まり、1ずつ増やされます。
そして、tempN mod 4 = 0になった時点で繰返し処理を終了します。

mod 4の余りは0、1、2、3のいずれかなので、余りを0にするために必要な+1の回数は最大3回です。
よってaは、iを1から3まで1ずつ増やす、が適切です。

3. function2の次のfor(b)の役割を確認する

最初のfor終了後のtempNは、n以上で最初の4の倍数です。
4の倍数は4ずつ増えるので、tempNからmを超えない範囲で4ずつ増やし、その回数だけcountを増やすと、function1と同じ個数になります。
よってbは、jをtempNから始めてmを超えない範囲で4ずつ増やす、が適切です。

4. 組合せを選ぶ

  • a:iを1から3まで1ずつ増やす

  • b:jをtempNから始めてmを超えない範囲で4ずつ増やす

この組合せは「カ」です。

選択肢ごとの解説

不正解

aが「iを1から2まで1ずつ増やす」だと、n mod 4が1の場合に2回の+1では4の倍数に到達できません(余りが3で止まります)。またbが「jをnから始めてmを超えない範囲でtempNずつ増やす」だと、増分が4ではないため、4の倍数だけを数えることになりません。よって誤りです。

不正解

aが「iを1から2まで1ずつ増やす」だと、4の倍数に合わせる調整が不足する場合があります。bが「jをtempNからmまで1ずつ増やす」だと、tempN以降のすべての整数を数えるため、4の倍数の個数になりません。よって誤りです。

不正解

bが「jをtempNから始めてmを超えない範囲で4ずつ増やす」は4の倍数を数える形としては適切です。しかしaが「iを1から2まで1ずつ増やす」だと調整が不足する場合があるため、function1と一致しません。よって誤りです。

不正解

aが「iを1から3まで1ずつ増やす」は、tempNを4の倍数に合わせるために適切です。一方、bが「jをnから始めてmを超えない範囲でtempNずつ増やす」だと増分が4に固定されず、4の倍数だけを数えることになりません。よって誤りです。

不正解

aが「iを1から3まで1ずつ増やす」は適切です。しかしbが「jをtempNからmまで1ずつ増やす」だと、4の倍数以外も数えてしまい、function1と一致しません。よって誤りです。

正解

aを「iを1から3まで1ずつ増やす」とすることで、tempNをn以上で最初の4の倍数に合わせられます。bを「jをtempNから始めてmを超えない範囲で4ずつ増やす」とすることで、4の倍数だけを数えられるため、function1と同じ戻り値になります。よって正解です。

まとめ

function1は、nからmまでの整数のうち、4の倍数(i mod 4 = 0)の個数を数えています。function2で同じ結果にするには、最初のfor(a)でtempNをn以上で最初の4の倍数まで1ずつ増やして合わせます。mod 4の余りは0~3なので、この調整は最大3回で済みます。次のfor(b)では、tempNからmを超えない範囲で4ずつ増やし、その回数を数える必要があります。

順次、単語を追加予定です。もうしばらくお待ちください。