はまやんはまやんはまやん

hamayanhamayan's blog

日本の暦 [パソコン甲子園2016 予選 C]

https://onlinejudge.u-aizu.ac.jp/challenges/sources/PCK/Prelim/0337?year=2016

解法

https://onlinejudge.u-aizu.ac.jp/solutions/problem/0337/review/3140004/hamayanhamayan/C++14

実装問題。
なるべく簡単に実装できるように実装方針をまず考えよう。
プログラムで扱いやすいように和暦の情報を配列に入れておこう。
i番目の和暦は名前がname[i]で、西暦ではL[i]~R[i]年である。
これを用意することでスマートに実装ができる(R[i]を使わない実装もあるだろう)。
 
E=0のときは、ループで4つ回してYがL[i]~R[i]の中に収まっている和暦が分かる。
和暦が分かれば、Y-L[i]+1とすることでその和暦での年が計算できる。
 
0<Eのときは、和暦を明治、大正、昭和、平成の順にしておけば、E-1が対応する和暦のindexとなる。
すると、和暦での年を西暦に変換するにはL[E-1]+Y-1とすればいい。

int E, Y;
string name[4] = { "M", "T", "S", "H" };
int L[4] = { 1868, 1912, 1926, 1989 };
int R[4] = { 1911, 1925, 1988, 2016 };
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> E >> Y;

    if (E == 0) {
        rep(i, 0, 4) if (L[i] <= Y and Y <= R[i]) {
            printf("%s%d\n", name[i].c_str(), Y - L[i] + 1);
            return;
        }
    } else {
        int year = L[E - 1] + Y - 1;
        printf("%d\n", year);
    }
}