過去問解きまくり研究所 ホーム

令和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 の組合せの表。

答えと解説を見る

✓ これが正解カa:iを1から3まで1ずつ増やす / b:jをtempNから始めてmを超えない範囲で4ずつ増やす

解説

最大3回で4の倍数へ進め、そこから4ずつ数えれば一致します。

function1は、nからmまでの整数のうち4で割り切れるもの、つまり4の倍数の個数を数えています。function2は同じ個数を別の手順で求める関数で、前半の繰返し処理でtempNをn以上で最初の4の倍数まで進め、後半の繰返し処理でそこから先の4の倍数を数える、という二段構えになっています。軸は、前半が最大何回回れば足りるかと、後半をどう進めれば4の倍数だけを数えられるかの2点です。

前半は、各回の先頭でtempN mod 4が0かを調べ、0でなければtempNに1を足します。n=5、m=15で追うと、1回目は5を調べて6へ、2回目は6を調べて7へ、3回目は7を調べて8へ進み、ここで3回が終わってtempNは8です。nを4で割った余りが1のときに最も多く進める必要があり、その回数が3なので、iを1から3まで回せば、どのnでもtempNは4の倍数に届きます。

後半は、jをtempNから始めてmを超えない範囲で4ずつ増やし、1回ごとにcountに1を足します。n=5、m=15ではjが8と12の2回でcountは2になり、function1が数える8と12の2個と一致します。n=6、m=20でも、tempNは8になり、jは8・12・16・20の4回で、function1の4個と一致します。よって、aはiを1から3まで1ずつ増やす、bはjをtempNから始めてmを超えない範囲で4ずつ増やす、の組合せです。

見分け方は、nの余りが1のような最も不利な値を入れて前半の回数を確かめ、後半は4の倍数だけを踏む進め方かを見ることです。

ほかの選択肢はなぜ違うのか

出典:令和7年度 基本情報技術者試験 科目B 問1

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)