排查无datetime模块的周日计数程序错误:结果173与预期171不符
问题分析与修正
你的代码结果比预期多2个的核心原因是错误统计了1900年的两个周日首日(1900年4月1日、7月1日),而题目要求的统计范围是1901年1月1日至2000年12月31日。此外,逐天遍历并重置索引的星期计算方式冗余且存在潜在逻辑漏洞,建议改用基于月份天数的星期偏移计算,更高效准确。
错误点拆解
- 统计范围越界:循环从1900年开始,将不属于目标区间的日期计入了总数,直接导致结果多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)
代码说明
- 初始星期设定:基于已知的1900年日历,直接设定1901年1月1日为周二(索引1),避免无效的前期遍历。
- 闰年处理:仅在遍历到2月时判断闰年,调整当月天数,逻辑清晰。
- 星期偏移计算:每月结束后,用当前星期数加上当月天数,再对7取模,直接得到下月首日的星期数,无需逐天遍历。
- 统计逻辑:每月开始时检查当前星期是否为周日(索引6),符合条件则计数加1。
运行修正后的代码,结果为171,与预期一致。
内容的提问来源于stack exchange,提问作者Reine Baudache
相关产品推荐
相关产品推荐

