【问题标题】:Algorithm logic - counting sundays算法逻辑 - 计数星期日
【发布时间】:2020-01-09 19:18:28
【问题描述】:

我编写了一个 sn-p 代码,用于计算从 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")

【问题讨论】:

  • 这是学校作业吗?如果没有,我建议查看calendar 模块。
  • @AndrejKesely 这是 ProjectEuler.net 的一个问题,该问题的重点是编写基于数学逻辑的快速代码。我可以使用外部库,但我的想法是强制使用数学来解决问题,而不是使用库。

标签: python algorithm logic


【解决方案1】:

看起来很傻,但你内部的两个 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 的引用,而不是复制代码。

【讨论】:

  • 非常感谢!我注意到其中一个循环中的错误,也忘记在另一个循环中更改它。
  • 特别是因为闰年一月的第一个星期日将被重复计算,而非闰年一月的第一个星期日- 闰年根本不计算在内。显然,这些几乎相互抵消。
猜你喜欢
  • 2022-12-29
  • 2018-04-03
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
相关资源
最近更新 更多