首页 > 解决方案 > 算法逻辑 - 计数星期日

问题描述

我写了一段代码,计算从 1901 年 1 月到 2000 年 12 月(含)当月第一天的星期日的次数。我知道正确答案是 171,比我得到的多一个。这意味着要么我的算法逻辑有错误,要么我误解了问题陈述。我希望有人指出我的错误。这是问题陈述和我的代码:

1900 年 1 月 1 日是星期一。三十天有九月、四月、六月和十一月。其余的都有三十一个,仅保存二月,它有二十八,风雨无阻。在闰年,二十九。

闰年出现在任何能被 4 整除的年份,但不会出现在世纪,除非它能被 400 整除。

在 20 世纪(1901 年 1 月 1 日至 2000 年 12 月 31 日)有多少个星期日是每月的第一天?

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

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

leap_year = False
sundays = 0
first_sunday = 6

for year in range(1901, 2001):
    if year % 4 == 0 and year % 100 != 0:
        leap_year = True
    elif year % 100 == 0 and year % 400 == 0:
        leap_year = True
    else:
        leap_year = False

    if leap_year:
        for month in range(1, 13):
            if first_sunday == 1:
                sundays += 1

            curr_sunday = first_sunday
            while curr_sunday < ly_monthdict[month]:
                curr_sunday += 7

            first_sunday = curr_sunday - ly_monthdict[month]


    else:
        for month in range(1, 13):
            curr_sunday = first_sunday
            while curr_sunday < monthdict[month]:
                curr_sunday += 7

            first_sunday = curr_sunday - monthdict[month]
            if first_sunday == 1:
                sundays += 1

print(sundays, "Sundays occured on the first of the month")

标签: pythonalgorithmlogic

解决方案


看起来很傻,但你的两个内部for..in块都不一样。

如果您将if first_sunday == 1检查移到非闰年循环的开头,您将得到 171 作为您的答案。

if leap_year:
    for month in range(1, 13):
        if first_sunday == 1:
            sundays += 1
        curr_sunday = first_sunday
        while curr_sunday < ly_monthdict[month]:
            curr_sunday += 7
        first_sunday = curr_sunday - ly_monthdict[month]
else:
    for month in range(1, 13):
        if first_sunday == 1:     #Moved this block up
            sundays += 1
        curr_sunday = first_sunday
        while curr_sunday < monthdict[month]:
            curr_sunday += 7
        first_sunday = curr_sunday - monthdict[month]

还要感谢 ProjectEuler,我已经十多年没有做过这些问题了。我建议您结合这两个循环并切换dict您使用的引用而不是复制代码。


推荐阅读