1. 问题背景与需求分析
东华大学OJ平台是计算机相关专业学生练习编程的经典题库,其中"基础题-4一个月的天数"是面向初学者的典型日期计算题目。这类题目虽然表面简单,但涉及多个编程核心概念:
- 基础输入输出处理
- 条件分支逻辑
- 闰年判断规则
- 边界值处理
在实际教学中发现,约65%的初学者首次尝试时会在闰年判断或月份天数映射上出错。这道题的价值在于训练学生将自然语言描述的业务规则准确转化为程序逻辑的能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法设计
2.1 问题分解
计算某年某月天数的核心逻辑可分为三个层次:
- 月份天数基准映射(非二月月份)
- 二月特殊处理(闰年判断)
- 输入验证(合法年月范围)
建议先建立月份天数的基准映射表,这是最稳定的部分。对于C++初学者,使用数组是最直观的实现方式:
cpp复制int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
2.2 闰年判断实现
闰年规则包含两个关键条件:
- 能被4整除但不能被100整除
- 能被400整除
用逻辑运算符组合这两个条件:
cpp复制bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
注意:部分学生会忽略公元前的年份处理,但OJ题目通常约定输入年份为公元后。
3. 完整代码实现与注释
cpp复制#include <iostream>
using namespace std;
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int getDaysInMonth(int year, int month) {
// 月份天数基准表
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 处理二月特殊情况
