CO-P13情報Ⅰ 対策問題

コンピュータとプログラミングプログラミング特訓 (第3問対策)

次のプログラムは、n が 1 より大きい間、n を半分にしながら「*」を1個ずつ表示する。実行したとき、「*」は何個表示されるか。 (1) n = 16 (2) n > 1 の間繰り返す: (3) | n = n ÷ 2 (4) ⎿ 表示する("*") ※ ÷は整数の商。

解答・解説を見る

正解: 1

正答

1

この問題のポイント

半分にし続けるループの回数(log₂n) を問う問題です。

解説

「n > 1 の間繰り返す」は、周回のたびにまず条件を判定し、真なら実行、偽になったら終了する形です。ループの中では n を半分にして「*」を1個表示するので、「n が半分にされた回数=表示される個数」になります。

n の変化を1ステップずつトレースします。
1周目: n=16>1 は真 → n=16÷2=8、「」1個目。
2周目: n=8>1 は真 → n=4、「
」2個目。
3周目: n=4>1 は真 → n=2、「」3個目。
4周目: n=2>1 は真 → n=1、「
」4個目。
5周目の判定: n=1>1 は偽 → ループ終了。
よって「*」は 4個 です。

16=2⁴ なので、半分にし続けて1になるまでの回数はちょうど4回(log₂16=4)。この「半分にすると回数は log₂n で済む」という感覚は、二分探索が速い理由そのものです。1024個のデータでも半分にし続ければ10回で1個に絞れます。逆に2倍にし続けるループ(1→2→4→…)はこの裏返しで、対で理解しておきましょう。

共通テストでは「このループは何回実行されるか」「nがいくつなら5回になるか」という形で問われます。条件付きループでは「最後の1回が実行されるか」の見極めが得点の分かれ目——n=2 のときは実行され(2>1は真)、n=1 になった瞬間に終わる、と判定のタイミングを丁寧に追うのがコツです。

選択肢の確認

1.○ 16→8→4→2→1 と4回半分にされ、そのたびに1個表示。
2.× 8は1回目の商。回数ではない。
3.× 16は初期値。回数ではない。
4.× n=1 では条件 1>1 が偽なので5回目は実行されない。

ここだけは覚えよう

半分にし続けるループは log₂n 回で終わる — 16なら4回、1024なら10回。二分探索が速い理由もこれ。

関連問題

CO-P12CO-P14