寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C言語による西暦と和暦の対応と変換

C言語による西暦と和暦の対応と変換です。
西暦と和暦の入力から、それぞれに対応した変換プログラムです。

・問題
 「西暦」は西洋から輸入された概念ですが、日本には暦上の年を表す方法として「元号」に年を付けて識別する和暦という概念があります。
 例えば今年は西暦なら2016年ですが、和暦なら平成28年です。
 どちらもよく使われる年の表現方法ですが、ある年の西暦がわかっていても和暦で何年かわからない、またはその逆の状況を経験したことはありませんか?
 西暦で年が与えられたとき和暦の年を、和暦で年が与えられたとき西暦の年を出力するプログラムを作成せよ。
 ただし、西暦と和暦の対応は、簡単のため以下のようにする。

西暦と和暦の対応
西暦 和暦
1868年から1911 明治元年から明治44年
1912年から1925年 大正元年から大正14年
1926年から1988年 昭和元年から昭和63年
1989年から2016年 平成元年から平成28年
・入力される値
 入力は以下の形式で与えられる。
   E Y
 入力は1行からなり、E (0 ≤ E ≤ 4) は与えられる暦の種類、
 Y はその暦での年であり、
 E が 0 のときは西暦 Y (1868 ≤ Y ≤ 2016)年、
 1 のときは和暦の明治 Y (1 ≤ Y ≤ 44)年、
 2 のときは和暦の大正 Y (1 ≤ Y ≤ 14)年、
 3 のときは和暦の昭和 Y (1 ≤ Y ≤ 63)年、
 4 のときは和暦の平成 Y (1 ≤ Y ≤ 28)年を表す。

・期待する出力
 西暦ならば和暦に、和暦ならば西暦に変換した結果を、1行に出力する。
 ただし、西暦を和暦に変換した結果は、明治なら文字「M」、大正なら文字「T」、昭和なら文字「S」、平成なら文字「H」を先頭に付けて出力する。

僕が作成、提出したコードは、以下のとおりです。

/*
 Problem Set from Volume3 0337 : Japanese Calendar
 http://judge.u-aizu.ac.jp/
 C言語による西暦と和暦の対応と変換
 https://neguse-atama.hatenablog.com
*/
#include<stdio.h>
int main(void){
    int E,Y;
    scanf("%d %d",&E,&Y);
    if(E==0){
        if(Y>=1868 && Y<=1911){
            printf("M%d\n",Y-1868+1);
        }else if(Y>=1912 && Y<=1925){
            printf("T%d\n",Y-1912+1);
        }else if(Y>=1926 && Y<=1988){
            printf("S%d\n",Y-1926+1);
        }else if(Y>=1989 && Y<=2016){
            printf("H%d\n",Y-1989+1);
        }
    }else if(E==1){
        printf("%d\n",Y+1868-1);
    }else if(E==2){
        printf("%d\n",Y+1912-1);
    }else if(E==3){
        printf("%d\n",Y+1926-1);
    }else if(E==4){
        printf("%d\n",Y+1989-1);
    }
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
Problem Set from Volume3 0337 : Japanese Calendar