You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算自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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:47:25