【洛谷 P8722】[蓝桥杯 2020 省 AB3] 日期识别 题解(模拟+字符串)

发布于:2024-03-27 ⋅ 阅读:(60) ⋅ 点赞:(0)

[蓝桥杯 2020 省 AB3] 日期识别

题目描述

小蓝要处理非常多的数据, 其中有一些数据是日期。

在小蓝处理的日期中有两种常用的形式:英文形式和数字形式。

英文形式采用每个月的英文的前三个字母作为月份标识,后面跟两位数字表示日期,月份标识第一个字母大写,后两个字母小写, 日期小于 10 10 10 时要补前导 0 0 0 1 1 1 月到 12 12 12 月英文的前三个字母分别是 JanFebMarAprMayJunJulAugSepOctNovDec

数字形式直接用两个整数表达,中间用一个空格分隔,两个整数都不写前 导 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;
}


网站公告

今日签到

点亮在社区的每一天
去签到