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

排查无datetime模块的周日计数程序错误:结果173与预期171不符

问题分析与修正

你的代码结果比预期多2个的核心原因是错误统计了1900年的两个周日首日(1900年4月1日、7月1日),而题目要求的统计范围是1901年1月1日至2000年12月31日。此外,逐天遍历并重置索引的星期计算方式冗余且存在潜在逻辑漏洞,建议改用基于月份天数的星期偏移计算,更高效准确。

错误点拆解

  1. 统计范围越界:循环从1900年开始,将不属于目标区间的日期计入了总数,直接导致结果多2。
  2. 星期计算逻辑低效:逐天遍历的方式没必要,通过月份天数对7取模计算下月首日的星期,既简洁又不易出错。

修正后的代码

# 统计1901年1月1日至2000年12月31日期间每月首日为周日的数量
months_days = [31,28,31,30,31,30,31,31,30,31,30,31]
count = 0

# 1901年1月1日是周二(已知:1900年是平年共365天,365%7=1,1900年1月1日为周一,故1901年首日为周二)
current_weekday = 1  # 索引对应:0=周一,1=周二,...,6=周日

for year in range(1901, 2001):
    for i in range(12):
        # 检查当月首日是否为周日
        if current_weekday == 6:
            count += 1
        # 计算下月首日的星期
        days = months_days[i]
        # 处理闰年2月
        if i == 1:  # 2月对应列表索引1
            if year % 4 == 0:
                if year % 100 == 0 and year % 400 != 0:
                    days = 28
                else:
                    days = 29
            else:
                days = 28
        current_weekday = (current_weekday + days) % 7

print(count)

代码说明

  1. 初始星期设定:基于已知的1900年日历,直接设定1901年1月1日为周二(索引1),避免无效的前期遍历。
  2. 闰年处理:仅在遍历到2月时判断闰年,调整当月天数,逻辑清晰。
  3. 星期偏移计算:每月结束后,用当前星期数加上当月天数,再对7取模,直接得到下月首日的星期数,无需逐天遍历。
  4. 统计逻辑:每月开始时检查当前星期是否为周日(索引6),符合条件则计数加1。

运行修正后的代码,结果为171,与预期一致。

内容的提问来源于stack exchange,提问作者Reine Baudache

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:18:32