python - 算法逻辑 - 计数星期日
问题描述
我写了一段代码,计算从 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")
解决方案
看起来很傻,但你的两个内部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
您使用的引用而不是复制代码。
推荐阅读
- flutter - 如何创建联系人列表
- google-app-engine - Google App Engine 项目根位置
- javascript - 正文部分的 CSS 选择器
- reactjs - React 无法识别 DOM 元素上的“activeKey”(和“activeHref”)道具
- python - Python3搭建一个简单的健身工具
- ruby-on-rails - Rails连接表不保存
- javascript - 如何用 hiphen 定义 javascript 变量?
- javascript - 如何一个接一个地同时单击页面上的所有按钮?
- c# - 通过 HTTPS 上传 .mp4
- c++ - QVTKWidget SetRenderWindow() 与 PCLVisualizer 异常