计算自2000年1月1日起的天数函数异常问题排查
问题分析与修复
你的代码核心问题出在闰年统计的范围错误,导致非闰年年份的总天数计算偏少。
具体错误点
在计算完整年份贡献的天数时,你用for (int i=2001; i<=y; i++)统计闰年数,但这个范围完全错误:
- 我们需要统计的是2000年到y-1年的闰年数量——这些是从2000年1月1日到目标年份y的1月1日之间,所有完整度过的年份,它们的闰年会额外增加一天。
- 当前代码统计的是2001年到y年的闰年,既漏掉了2000年这个闰年(2000是符合规则的闰年),又错误地把目标年份y的闰年算进去了(但y年还没完整度过,它的闰年影响只体现在当年2月的天数,这部分你已经在
add_months里正确处理了)。
为什么部分年份正确、部分错误?
- 当目标年份y是闰年时(比如2020),2001到y的闰年数刚好等于2000到y-1的闰年数(把2000换成y,两者都是闰年,数量不变),所以
add_years的计算结果碰巧正确。 - 当目标年份y不是闰年时(比如2029),2001到y的闰年数比2000到y-1的闰年数少1(漏掉了2000年的闰年),导致
add_years少算1天,最终总天数出错。如果涉及跨多个闰年的累计误差,可能会出现少算2-3天的情况。
修复方法
把统计闰年的循环范围改成从2000到y-1:
for (int i=2000; i < y; i++){ if(isLeapYear(i)) leap_count ++; }
这样就能准确统计所有完整度过的年份中的闰年数量,add_years的计算就会正确。
验证例子
以2029年5月5日为例:
- 修复前:leap_count统计2001-2029的闰年数为7个,
add_years = 366*7 + 365*(29-7) = 10592 - 修复后:leap_count统计2000-2028的闰年数为8个,
add_years = 366*8 + 365*(29-8) = 10593,补上了漏掉的1天,加上月份和天数的计算,结果就正确了。
另外,你的isLeapYear函数逻辑是正确的,无需修改。
内容的提问来源于stack exchange,提问作者Nare Avetisyan
相关产品推荐
相关产品推荐

