题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入描述
输出描述
输入输出样例
示例
输入
02/03/04
输出
2002-03-04
2004-02-03
2004-03-02
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
总通过次数: 6739 | 总提交次数: 8832 | 通过率: 76.3%
难度: 困难 标签: 2017, 暴力, 枚举, 省赛
代码:
#include<stdio.h>
#include<stdbool.h>
// 定义每个月的最大天数(非闰年)
int max_days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 检查日期的合法性
bool check(int year, int month, int day) {
// 月份必须在 1 到 12 之间
if (month == 0 || month > 12) return false;
// 日期不能为 0
if (day == 0) return false;
// 对于非闰年的二月以及其他月份,检查日期是否超出范围
if (month != 2) {
if (day > max_days[month]) return false;
} else { // 对于闰年的二月,特别判断
// 判断闰年条件:能被4整除但不能被100整除,或者能被400整除
int leap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if (day > 28 + leap) return false; // 二月最多 28 或 29 天
}
return true; // 日期合法
}
int main() {
int a, b, c;
scanf("%d/%d/%d", &a, &b, &c); // 输入格式为年/月/日
// 遍历从 1960 年 1 月 1 日到 2059 年 12 月 31 日的所有日期
for (int data = 19600101; data <= 20591231; data++) {
int year = data / 10000; // 获取年份
int month = data % 10000 / 100; // 获取月份
int day = data % 100; // 获取日期
// 检查日期合法性
if (check(year, month, day)) {
// 判断是否满足输入的任一条件:年/月/日,月/日/年,日/月/年
if (year % 100 == a && month == b && day == c ||
month == a && day == b && year % 100 == c ||
day == a && month == b && year % 100 == c) {
// 输出符合条件的日期,格式为 YYYY-MM-DD
printf("%d-%02d-%02d\n", year, month, day);
}
}
}
return 0;
}
代码注释解释:
-
max_days 数组:
- 存储每个月份的最大天数,索引从1开始,对应着月份。
-
check 函数:
- 参数
year
,month
,day
:表示要检查的年、月、日。 - 检查月份是否在有效范围内(1到12)。
- 检查日期是否为0,如果是则返回
false
。 - 对于非闰年的每个月份,检查日期是否超出该月最大天数。
- 对于闰年的二月,根据闰年规则判断是否超出29天。
- 参数
-
主函数 main:
- 输入
a
,b
,c
表示要搜索的日期条件(年、月、日)。 - 使用
scanf
从标准输入获取这些值。 - 循环遍历从 1960 年 1 月 1 日到 2059 年 12 月 31 日的每一天。
- 将整数形式的日期
data
转换为年、月、日形式。 - 调用
check
函数验证该日期是否合法。 - 如果日期合法,检查是否满足输入的任一条件:年/月/日,月/日/年,日/月/年。
- 如果满足条件,使用
printf
输出符合条件的日期,格式为YYYY-MM-DD
。
- 输入