1. 问题分析与需求拆解
日期计算是编程中常见但容易出错的场景,尤其是涉及跨月、跨年时需要考虑闰年和平年的区别。这个题目要求我们实现一个能够计算n天后日期的函数,核心在于正确处理日期进位和闰年判断。
从输入输出样例可以看出,当输入2000年1月1日加上366天后,正确输出应该是2001年1月1日。这是因为2000年是闰年(能被400整除),全年有366天。这个案例验证了我们的算法需要正确处理闰年情况。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法设计思路
2.1 日期进位的基本原理
日期计算的核心在于理解"进位"机制。当某个月的天数被加满后,需要进位到下一月;当年底最后一个月被加满后,需要进位到下一年。具体来说:
- 从当前日期开始,将n天直接加到day变量上
- 检查day是否超过当前月份的最大天数
- 如果超过,则减去当前月份的天数,month加1
- 如果month超过12,则重置为1,year加1
- 重复上述过程直到day不再超过当前月份的天数
2.2 闰年判断的关键逻辑
闰年判断是日期计算中最容易出错的部分。根据格里高利历规则:
- 能被400整除的年份是闰年
- 能被100整除但不能被400整除的年份不是闰年
- 能被4整除但不能被100整除的年份是闰年
- 其他年份不是闰年
在代码中,我们使用以下条件判断:
cpp复制if(year%400==0 || (year%4==0 && year%100!=0))
days[2] = 29;
2.3 月份天数存储技巧
代码中使用了一个数组来存储每个月的天数:
cpp复制int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
这种设计有几个优点:
- 数组下标1-12对应1-12月,直观易读
- 2月默认28天,遇到闰年时动态修改为29天
- 第0个元素设为0,不使用,保持月份与数组下标一致
3. 代码实现详解
3.1 主函数结构解析
cpp复制int main() {
// 输入处理
int y,m,d,n;
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
