[202403-B]算日期
[202403-B]算日期
题目描述
给定三个整数 aaa、bbb、ccc,其中 aaa 是 1583 到 2400 的整数,bbb 和 ccc 是 1 到 99 的整数,请问 aaa 年 bbb 月 ccc 日是否是一个合法的日期(需要考虑闰年)?
输入格式
输入共一行,包含三个整数 aaa、bbb、ccc,相邻两个整数之间用一个空格隔开。
输出格式
输出共一行,包含一个字符串,如果输入的日期合法,则输出 “YES”,否则输出 “NO”。
样例 #1
样例输入 #1
2000 2 29
样例输出 #1
YES
样例 #2
样例输入 #2
2021 2 29
样例输出 #2
NO
样例 #3
样例输入 #3
2013 6 15
样例输出 #3
YES
样例 #4
样例输入 #4
2077 15 30
样例输出 #4
NO
提示
样例解释
样例解释:
-
样例#1:输入的日期是 2000 年 2 月 29 日,2000 年是闰年,2 月有29天,因此该日期是合法的,输出 “YES”。
-
样例#2:输入的日期是 2021 年 2 月 29 日,2021 年不是闰年,2 月最多有28天,因此该日期是不合法的,输出 “NO”。
-
样例#3:输入的日期是 2013 年 6 月 15 日,2013 年不是闰年,6 月最多有30天,因此该日期是合法的,输出 “YES”。
-
样例#4:输入的日期是 2077 年 15 月 30 日,由于没有 15 月,输出 “NO”。
数据范围
对于 40%40\%40% 的测试数据,年份不是闰年,且 1≤b≤121\le b \le 121≤b≤12。
对于所有测试数据,aaa 是 1583 到 2400 的整数,bbb 和 ccc 是 1 到 99 的整数。
🚀 题目解析:判断日期是否合法(考虑闰年)
🔍 思路分析:
- 年份范围
年份 aaa 在 1583 到 2400 之间,属于现代公历范围。 - 月份判断
月份 bbb 必须在 1 到 12 之间,否则日期不合法。 - 闰年判断
判断闰年的规则(公历):- 能被 400 整除的是闰年
- 能被 4 整除但不能被 100 整除的是闰年
- 其他年份不是闰年
- 天数判断
- 根据月份确定当月天数(闰年2月为29天,平年2月为28天)
- 天数 ccc 必须在 1 到当月最大天数之间
- 输出结果
- 合法输出 “YES”
- 不合法输出 “NO”
💡 月份对应天数表
月份 | 天数 (平年) | 备注 |
---|---|---|
1 | 31 | |
2 | 28 或 29 | 闰年为29天 |
3 | 31 | |
4 | 30 | |
5 | 31 | |
6 | 30 | |
7 | 31 | |
8 | 31 | |
9 | 30 | |
10 | 31 | |
11 | 30 | |
12 | 31 |
📄 C++ 参考代码实现:
#include <iostream>
using namespace std;int main() {int a, b, c;cin >> a >> b >> c;// 先判断月份是否合法if (b < 1 || b > 12) {cout << "NO" << endl;return 0;}// 判断是否闰年bool leap = false;if ((a % 400 == 0) || (a % 4 == 0 && a % 100 != 0)) {leap = true;}// 各个月份的天数(平年)int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 如果是闰年且2月,天数改为29if (leap && b == 2) {daysInMonth[1] = 29;}// 判断日期是否合法if (c >= 1 && c <= daysInMonth[b - 1]) {cout << "YES" << endl;} else {cout << "NO" << endl;}return 0;
}
🏆 样例测试:
输入 | 输出 | 解释 |
---|---|---|
2000 2 29 | YES | 2000年是闰年,2月29日合法 |
2021 2 29 | NO | 2021年不是闰年,2月没有29日 |
2013 6 15 | YES | 6月有30天,15日合法 |
2077 15 30 | NO | 15月不存在 |