1. 题目解析与需求拆解
这道编程题要求计算两个日期之间的天数差,属于典型的日期处理类问题。在实际开发中,日期计算是高频需求,比如电商平台的优惠券有效期计算、项目管理工具的工期统计等场景都会用到类似逻辑。
题目核心考察点包括:
- 日期合法性验证(闰年判断、月份天数处理)
- 日期标准化处理(将日期转换为统一计量单位)
- 边界情况处理(同一年、跨年、闰月等情况)
特别注意:日期类题目看似简单,但实际隐藏大量边界条件,这也是GESP考试常见的"陷阱"设计方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 日期处理核心算法
2.1 闰年判定规则
闰年计算遵循格里高利历规则:
- 能被4整除但不能被100整除的是闰年
- 能被400整除的也是闰年
cpp复制bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
2.2 月份天数映射
需要特别注意2月份的天数随闰年变化:
cpp复制int daysInMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int getDays(int year, int month) {
if (month == 2 && isLeapYear(year))
return 29;
return daysInMonth[month];
}
3. 完整解题实现
3.1 日期标准化方案
将日期转换为从基准日(如公元1年1月1日)开始的总天数:
cpp复制int dateToDays(int y, int m, int d) {
int total = 0;
// 累加完整年份的天数
for (int i = 1; i < y; i++) {
total += isLeapYear(i) ? 366 : 365;
}
// 累加当年月份的天数
for (int i = 1; i < m; i++) {
total += getDays(y, i);
