FLYING

/* TODO: 気の利いた説明を書く */

西暦を和暦に変換するプログラム

パソコン甲子園2005年度予選問題の問11より。西暦で入力された年月日を和暦表示に変換せよという問題。西暦と和暦の対応表は以下の通り。

元号 期間
明治 1868-09-08 〜 1912-07-29
大正 1912-07-30 〜 1926-12-24
昭和 1926-12-25 〜 1989-01-07
平成 1989-01-08 〜

条件判断が非常にまんどくさそうな問題なんだけど、この前「年齢の求め方」で紹介した方法を応用したら結構シンプルに書けた。yyyymmdd表記を使うのがポイント。

#include <stdio.h>

int main(void)
{
	int y, m, d, t, result;
	char *nengo[] = { "明治以前", "明治", "大正", "昭和", "平成" };
	
	scanf("%d %d %d", &y, &m, &d);
	
	t = y * 10000 + m * 100 + d;
	
	if (t < 18680908) {
		result = 0;
	} else if (t < 19120730) {
		result = 1;
		y -= 1867;
	} else if (t < 19261225) {
		result = 2;
		y -= 1911;
	} else if (t < 19890108) {
		result = 3;
		y -= 1925;
	} else {
		result = 4;
		y -= 1988;
	}
	
	if (result) {
		printf("%s%d%d%d\n", nengo[result], y, m, d);
	} else {
		printf("%s\n", nengo[result]);
	}
	
	return 0;
}