[蓝桥杯 2020 省 AB3] 日期识别
题目描述
小蓝要处理非常多的数据, 其中有一些数据是日期。
在小蓝处理的日期中有两种常用的形式:英文形式和数字形式。
英文形式采用每个月的英文的前三个字母作为月份标识,后面跟两位数字表示日期,月份标识第一个字母大写,后两个字母小写, 日期小于 10 10 10 时要补前导 0 0 0。 1 1 1 月到 12 12 12 月英文的前三个字母分别是 Jan
、Feb
、Mar
、Apr
、May
、Jun
、Jul
、Aug
、Sep
、Oct
、Nov
、Dec
。
数字形式直接用两个整数表达,中间用一个空格分隔,两个整数都不写前 导 0
。其中月份用 1 1 1 至 12 12 12 分别表示 1 1 1 月到 12 12 12 月。
输入一个日期的英文形式, 请输出它的数字形式。
输入格式
输入一个日期的英文形式。
输出格式
输出一行包含两个整数,分别表示日期的月和日。
样例 #1
样例输入 #1
Feb08
样例输出 #1
2 8
样例 #2
样例输入 #2
Oct18
样例输出 #2
10 18
提示
蓝桥杯 2020 第三轮省赛 AB 组 F 题。
思路
首先,定义一个常量字符串数组MONTH,包含12个月份的英文缩写。
在主函数中,首先读取一个字符串输入,然后分别提取月份和日期。月份是字符串的前三个字符,日期是接下来的两个字符。
日期可能包含前导的’0’,使用find_first_not_of
函数找到第一个不是’0’的字符的位置,然后使用substr
函数去掉前导的’0’。
然后,通过遍历MONTH数组,找到月份字符串在数组中的位置,即为月份的数字形式。注意数组的索引是从0开始的,所以需要加1。
最后,输出月份和日期的数字形式,两者之间用空格隔开。如果找到月份,就直接结束循环,输出结果并返回。
AC代码
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
const string MONTH[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string str;
cin >> str;
string mon = str.substr(0, 3);
string day = str.substr(3, 2);
int index = day.find_first_not_of('0');
day = day.substr(index, (index) ? (1) : (2));
for (int i = 0; i < 12; i++) {
if (MONTH[i] == mon) {
cout << (i + 1) << " " << day << "\n";
break;
}
}
return 0;
}