|
2021年10月18日
情報オリンピック日本委員会
|
この課題には複数の解法が考えられる.以下に主な 2 つの方針を挙げ,参考にするべきソースコードを紹介する.
12 から後の番号も,12 の次が 13,13 の次が 14,...というふうに重ねて付けてみる.目盛りが 12 個進むごとに 1 周するので,番号を 12 で割った余りによって各目盛りに分類できる.具体的には,
A の目盛りから B 個進んだら,番号は A+B になる.したがって A+B を 12 で割った余りを計算し,上の対応から目盛りに対応づければよい.
1 から 11 までは余りそのままで,0 の場合のみ 12 となるので,この 2 つの場合について条件分岐を行えばよい(C/C++ といった言語であれば if 文で実現できる).
C++ の実装例 1 や Python の実装例がこの方針を採用しているので,参考にできるだろう.
「番号を次の目盛りのものに更新する」,すなわち「12 であれば 1 にし,それ以外であれば番号に 1 加える」という操作を B 回行えばよい.操作内の条件分岐のほか,繰り返し処理が必要となる(C/C++ といった言語であれば for 文で実現できる).
C++ の実装例 2 がこの方針を採用しているので,参考にできるだろう.
この課題では四則演算・余りの計算のほか,条件分岐の処理が実装できることが求められている.また,繰り返し処理が書けるなら方針の幅が広がる課題でもある.
方針選択の観点では,「数学的な構造を見抜く」「シミュレーション」のいずれも非常に基礎的かつ重要な視点である.より難しい課題ではこれらの方針を使い分け,時に併用することが求められるだろう.