【发布时间】: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 的一个问题,该问题的重点是编写基于数学逻辑的快速代码。我可以使用外部库,但我的想法是强制使用数学来解决问题,而不是使用库。