第31問 うるう年の判定
うるう年は「4の倍数の年はうるう年。ただし100の倍数の年は平年。ただし400の倍数の年はうるう年」というルールで決まります。year(=1900)について、うるう年なら uruu を1、平年なら0に書きかえながら判定するプログラムです。上から順に3つの条件で uruu を上書きしていくので、入れる式の順番がとても大事です(3か所の穴をうめよう)
難易度:★★★★☆(4/やや難しい)。共通テスト「情報I」で使われるDNCL(共通テスト用プログラム表記)の穴埋め問題です。JavaScriptを有効にすると、このページでプログラムを組み立てて実行しながら解けます。
プログラム
year = 1900
uruu = 0
もし [A] == 0 ならば:
uruu = 1
もし [B] == 0 ならば:
uruu = 0
もし [C] == 0 ならば:
uruu = 1
もし uruu == 1 ならば:
表示する(year + "年はうるう年です")
そうでなければ:
表示する(year + "年は平年です")
空欄 [A]・[B]・[C] に当てはまるものを、次の選択肢から選びます。
選択肢
year % 4
year % 100
year % 400
year / 4
year / 100
year / 400
ヒント
ルールの文章と同じ順番に、4 → 100 → 400 と書いていきます。上の行から順に uruu が上書きされるので、あとに書いた例外のほうが強くなります。倍数の判定はどれも % のあまりが0かどうかで調べよう
解答
- 空欄 [A] …
year % 4
- 空欄 [B] …
year % 100
- 空欄 [C] …
year % 400
よくある間違い
- [A]
year % 400 [B]year % 100 [C]year % 4 … 順番が逆です。この並びだと最後の「4の倍数ならうるう年」がすべてを上書きしてしまい、1900年もうるう年になってしまいます。まず4の倍数でうるう年にして、次に100の倍数で平年にもどし、最後に400の倍数だけうるう年にします
- [A]
year % 4 [B]year % 400 [C]year % 100 … 100と400が入れかわっています。この並びだと1900年が最後の「100の倍数」でうるう年に上書きされてしまいます。400の倍数の例外はいちばん最後に置きます
- [A]
year % 100 [B]year % 4 [C]year % 400 … 1つ目は「4の倍数ならうるう年」という土台の条件です。100の倍数で先にうるう年にしてしまうと、そのあとの4の倍数で平年にもどってしまい、2024年のようなふつうのうるう年が平年になります
- [A]
year / 4 [B]year % 100 [C]year % 400 … 「4の倍数かどうか」はわり算の「あまり」が0かで調べます。year / 4 は商なので 1900 / 4 = 475 となり、0にならず倍数の判定ができません。% を使いましょう
- [A]
year % 4 [B]year / 100 [C]year % 400 … 「100の倍数かどうか」も「あまり」で調べます。year / 100 は商の19になってしまい、0かどうかでは判定できません。year % 100 なら 1900 のあまりは0になります
- [A]
year % 4 [B]year % 100 [C]year / 400 … 「400の倍数かどうか」も「あまり」で調べます。year / 400 は商なので、2000年でも 5 となって0になりません。year % 400 を使いましょう
- [A]
year % 4 [B]year % 4 [C]year % 400 … 同じ条件を2回書くと、4の倍数の年をうるう年にしてすぐ平年にもどしてしまいます。2つ目には「100の倍数なら平年」の year % 100 を入れます
ほかの問題