央视新闻发了一条微博,指出 2020 年有个罕见的“对称日”,即 2020 年 2 月 2 日,按照 年年年年月月日日 格式组成的字符串 20200202 是完全对称的。
给定任意一个日期,本题就请你写程序判断一下,这是不是一个对称日?
输入格式:
输入首先在第一行给出正整数 N(1<N≤10)。随后 N 行,每行给出一个日期,却是按英文习惯的格式:Month Day, Year。其中 Month 是月份的缩写,对应如下:
一月:Jan
二月:Feb
三月:Mar
四月:Apr
五月:May
六月:Jun
七月:Jul
八月:Aug
九月:Sep
十月:Oct
十一月:Nov
十二月:Dec
Day 是月份中的日期,为 [1, 31] 区间内的整数;Year 是年份,为 [1, 9999] 区间内的整数。
输出格式:
对每一个给定的日期,在一行中先输出 Y 如果这是一个对称日,否则输出 N;随后空一格,输出日期对应的 年年年年月月日日 格式组成的字符串。
输入样例:
5
Feb 2, 2020
Mar 7, 2020
Oct 10, 101
Nov 21, 1211
Dec 29, 1229
输出样例:
Y 20200202
N 20200307
Y 01011010
Y 12111121
N 12291229
解题思路:
先把原始数据转换成方便判断的格式,再比对一下就可以了
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
char *Month[] = {
"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",
};
int main(int argc, const char *argv[]) {
int N, i, j, year, mon, day;
char dateStr[9], month[4];
bool isMirror = true;
if ( scanf("%d", &N)==EOF ) printf("error\n");
while ( N-- ) {
if ( scanf("%s %d, %d", month, &day, &year)==EOF ) printf("error\n");
for ( mon=1; mon<=12; ++mon )
if ( strcmp(month, Month[mon])==0 ) break;
sprintf(dateStr, "%04d%02d%02d", year, mon, day);
for ( i=0, j=7; i<j; ++i, --j ) {
if ( dateStr[i] != dateStr[j] ) {
isMirror = false;
break;
}
}
if ( i>=j ) isMirror = true;
printf("%c %s\n", isMirror ? 'Y' : 'N', dateStr);
}
return 0;
}