题目概述
央视新闻发了一条微博,指出 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
C++代码实现
#include <iostream>
#include <map>
using namespace std;
bool isPalindrome(string s) {
for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
if (s[i] != s[j]) {
return false;
}
}
return true;
}
int main() {
map<string, int> mp;
mp["Jan"] = 1;
mp["Feb"] = 2;
mp["Mar"] = 3;
mp["Apr"] = 4;
mp["May"] = 5;
mp["Jun"] = 6;
mp["Jul"] = 7;
mp["Aug"] = 8;
mp["Sep"] = 9;
mp["Oct"] = 10;
mp["Nov"] = 11;
mp["Dec"] = 12;
int n;
cin >> n;
cin.ignore(); // 清除缓冲区中的回车符
string month, day, year, data, s;
for (int i = 1; i <= n; i++) {
getline(cin, data);
month = data.substr(0, 3);
int month_int = mp[month];
size_t douhao = data.find(",");
day = data.substr(4, douhao - 4);
size_t daoshukongge = data.rfind(' '); //倒数第一个空格的位置
year = data.substr(daoshukongge + 1);
s = "";
if(year.size() == 1){
s += "000";
}else if(year.size() == 2){
s += "00";
}else if(year.size() == 3){
s += '0';
}
s += year;
if (month_int < 10) {
s += '0';
}
s += to_string(month_int);
if (day.size() == 1) {
s += '0';
}
s += day;
if (isPalindrome(s)) {
cout << "Y " << s;
} else {
cout << "N " << s;
}
cout << endl;
}
return 0;
}