题解:洛谷 P5716 月份天数
【题目来源】
【题目描述】
输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年。
【输入】
输入两个正整数,分别表示年份 \(y\) 和月数 \(m\),以空格隔开。
【输出】
输出一行一个正整数,表示这个月有多少天。
【输入样例】
1926 8
【输出样例】
31
【核心思想】
-
问题分析:给定年份 \(y\) 和月份 \(m\),输出该月的天数。需考虑闰年对2月天数的影响(闰年29天,平年28天),其他月份天数固定(1,3,5,7,8,10,12月31天;4,6,9,11月30天)。
-
算法选择:
- switch分支:按月份分12个case,2月单独处理闰年判断,其余月份直接输出固定天数
-
关键步骤:
- 读入数据:
cin >> y >> m - switch(m):
case 2:闰年判断y%4==0 && y%100!=0 || y%400==0,真则输出29,否则28- 大月(1,3,5,7,8,10,12):输出31
- 小月(4,6,9,11):输出30
- 输出对应天数
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),单次判断和输出
- 空间复杂度:\(O(1)\),仅需两个整型变量
-
日期查询的核心思想:
- 固定规则查表:除2月外各月天数固定,可用switch直接映射
- 闰年特殊处理:2月天数依赖年份,需嵌入闰年判断逻辑
- 格里高利历规则:
y%4==0 && y%100!=0 || y%400==0精确判断闰年 - 适用于日期计算、日历查询、条件分支类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int y, m; // 定义变量:年份y,月份m
cin >> y >> m; // 输入年份和月份
// 使用switch语句处理不同月份的天数
switch(m)
{
case 1: // 一月
cout << 31;
break;
case 2: // 二月(特殊处理闰年)
if(y%4==0 && y%100!=0 || y%400==0)
cout << 29; // 闰年2月29天
else
cout << 28; // 平年2月28天
break;
case 3: // 三月
cout << 31;
break;
case 4: // 四月
cout << 30;
break;
case 5: // 五月
cout << 31;
break;
case 6: // 六月
cout << 30;
break;
case 7: // 七月
cout << 31;
break;
case 8: // 八月
cout << 31;
break;
case 9: // 九月
cout << 30;
break;
case 10: // 十月
cout << 31;
break;
case 11: // 十一月
cout << 30;
break;
case 12: // 十二月
cout << 31;
break;
}
return 0; // 程序正常结束
}
【运行结果】
1926 8
31
浙公网安备 33010602011771号