読者です 読者をやめる 読者になる 読者になる

FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

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

パソコン甲子園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;
}