pat basic 1111 对称日

央视新闻发了一条微博,指出 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;
}

猜你喜欢

转载自blog.csdn.net/herbertyellow/article/details/129090118