令和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から2まで1ずつ増やす / b:jをnから始めてmを超えない範囲でtempNずつ増やす
- イa:iを1から2まで1ずつ増やす / b:jをtempNからmまで1ずつ増やす
- ウa:iを1から2まで1ずつ増やす / b:jをtempNから始めてmを超えない範囲で4ずつ増やす
- エa:iを1から3まで1ずつ増やす / b:jをnから始めてmを超えない範囲でtempNずつ増やす
- オa:iを1から3まで1ずつ増やす / b:jをtempNからmまで1ずつ増やす
- カa:iを1から3まで1ずつ増やす / b:jをtempNから始めてmを超えない範囲で4ずつ増やす
答えと解説を見る
✓ これが正解カ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の倍数だけを踏む進め方かを見ることです。
ほかの選択肢はなぜ違うのか
- 項番a:aにはiを1から3まで1ずつ増やす形が入ります。iを1から2までとする形では、nを4で割った余りが1のとき足りません。n=5なら5→6→7と2回進んだところで終わり、tempNは4の倍数でない7のまま後半に渡ってしまいます。
- 項番b:bにはjをtempNから始めてmを超えない範囲で4ずつ増やす形が入ります。tempNからmまで1ずつ増やす形は、4の倍数以外の数まで数えるので、n=5、m=15では8〜15の8個になります。nから始めてtempNずつ増やす形は、n=6、m=20ならjが6と14の2回となり、正しい4個と食い違います。
出典:令和7年度 基本情報技術者試験 科目B 問1
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)