最近在MOOC上学习Python,遇到一个日期计算的问题,现在来整理一下↓
题目描述
根据下列信息计算在1901年1月1日至2000年12月31日间共有多少个星期天落在每月的第一天上?
a)1900.1.1是星期一
b)1月,3月,5月,7月,8月,10月和12月是31天
c)4月,6月,9月和11月是30天
d)2月是28天,在闰年是29天
e)公元年数能被4整除且又不能被100整除是闰年
f)能直接被400整除也是闰年
输出格式
一个正整数
题目分析
- 第一种方法就是用if语句判断相关条件进行计算。
- 第二种方法比较简洁,即使用python中的calendar模块。调用monthcalendar函数,返回某个月以每一周为元素的序列。之后获得第一个元素(即第一周的日期排布),判断第1天出现的位置是否为6,即可判断每月第1天是否为星期天。
- 以2017年7月为例,该月日期分布如下图所示:
- 该月以每一周为元素的序列如下:[[0, 0, 0, 0, 0, 1, 2], [3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30], [31, 0, 0, 0, 0, 0, 0]]。根据上面方法进行判断,该月第一周是[0, 0, 0, 0, 0, 1, 2],1所在的位置是5而不是6(注意,从0开始计数),即落在星期六而非星期天,因此该月的第一天就不是星期天。
题目代码
方法1:
daySum=1
count=0
for year in range(1900,2001):
for month in range(1,13):
if month==1 or month==3 or month==5 or month==7 or month==8 or month==10 or month==12:
day=31
elif month==4 or month==6 or month==9 or month==11:
day=30
elif month==2:
if(year%400==0)or(year%4==0 and year%100==0):
day=29
else:
day=28
daySum+=day
if daySum%7==0 and year>1900:
count+=1
print count
方法2:
import calendar
count=0
for year in xrange(1901,2001):
for month in xrange(1,13):
if calendar.monthcalendar(year,month)[0].index(1) == 6:
count+=1
print count
相关参考
http://www.cnblogs.com/hongten/archive/2013/08/07/hongten_python_calendar.html