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

欧拉计划第19题代码问题排查:计算月首周日数得错误结果14

欧拉计划第19题代码错误分析与修正

你的代码存在几个关键逻辑错误,导致结果错误,以下是具体问题和修正方案:

1. 核心计数条件错误

你写的if day_name == day == month == 1: 完全不符合题目要求:

  • 这个条件仅当1月1日且星期数为1时才计数,但题目需要统计所有月份的第一天(day=1)且是周日的情况,不管是哪个月份。
  • 正确条件应为:if day == 1 and day_name == 1(根据你定义的星期编号,周日对应day_name=1)。

2. 月份字典键错误

你的months字典将12月的天数存在键0中,但代码中当month=12时,会直接访问months[12],字典中没有这个键,会触发KeyError。
修正后的字典应直接用1-12作为月份键:

months = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}

3. 循环终止条件无效

while not ((year == 2000) and (month == 0) and (day == 0))永远无法满足,因为month从1开始,每次mod12后只会得到1-11或1,不可能变成0。
正确的终止条件应判断是否超过2000年12月31日,比如:

while year < 2001 or (year == 2000 and month <= 12):

4. 日期推进逻辑不严谨

使用day = day % months[month]处理月末容易引发逻辑混淆,更直观的方式是判断日期是否超出当月天数,再重置日期并推进月份/年份:

day += 1
day_name = (day_name + 1) % 7
# 处理月末
if day > months[month]:
    day = 1
    month += 1
    # 处理年末
    if month > 12:
        month = 1
        year += 1
        # 更新二月天数(仅在年份变更时判断一次即可)
        if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
            months[2] = 29
        else:
            months[2] = 28

修正后的完整代码

if __name__ == '__main__':
    count_sundays = 0
    # 1901年1月1日是周二,对应day_name=3(按你的编号规则:2=周一,3=周二,...,1=周日)
    day_name = 3
    day = 1
    month = 1
    year = 1901
    months = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}
    
    # 初始设置1901年二月天数
    if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
        months[2] = 29
    else:
        months[2] = 28

    while year < 2001 or (year == 2000 and month <= 12):
        # 统计每月第一天是周日的情况
        if day == 1 and day_name == 1:
            count_sundays += 1
        
        # 推进日期和星期
        day += 1
        day_name = (day_name + 1) % 7
        
        # 处理月末
        if day > months[month]:
            day = 1
            month += 1
            # 处理年末
            if month > 12:
                month = 1
                year += 1
                # 更新下一年的二月天数
                if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
                    months[2] = 29
                else:
                    months[2] = 28

    print(count_sundays)

运行修正后的代码会得到正确结果171。

内容的提问来源于stack exchange,提问作者alon ein eli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:25:53