央视新闻发了一条微博,指出 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
分析:使用字符串M、D、Y分别保存题目输入的月、日、年,日后面会有一个多余的逗号,这里用erase把它擦掉。如果位数不足,则在前面补’0’。使用final保存最后的年份。使用symmetry为”Y”表示是对成日,为”N”表示不是对称日。使用map<string,sintrg> A将月份由英文缩写映射成数字。最后再通过判断前半部分的每个数字和后半部分对应的数字是不是一样的,得出它是不是一个对称数,就可以啦~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <map> using namespace std; int t; string M, D, Y, final, symmetry; map<string,string> A = {{"Jan", "01"}, {"Feb", "02"}, {"Mar", "03"}, {"Apr", "04"}, {"May", "05"}, {"Jun", "06"}, {"Jul", "07"}, {"Aug", "08"}, {"Sep", "09"}, {"Oct", "10"}, {"Nov", "11"}, {"Dec","12"}}; int main(){ for (cin >> t; t; t--) { cin >> M >> D >> Y; D.erase(D.end() - 1); M = A[M]; if(D.size() == 1) D = "0" + D; while(Y.size() < 4) Y = "0" + Y; final = Y + M + D; symmetry = "Y"; for (int i = 0; i < 4; i++) { if(final[i] != final[8 - i - 1]) { symmetry = "N"; break; } } cout << symmetry << ' ' << final << '\n'; } return 0; } |
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼