# -*- coding: UTF-8 -*-
""" Created on 2017/4/2 @author: cat """
import logging
""" 根据下列信息计算在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整除也是闰年 输出格式: 一个正整数 """
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S')
def is_leap(year):
""" 是否是闰年 :param year: :return: 闰年-> true ; 平年-> false """
return year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)
def year_total_day(year):
return 366 if is_leap(year) else 365
def month_total_day(year, month):
""" 一个月有多少天 :return: 当月的天数 """
if month < 1 or month > 12:
message = "month only range in [1,12] ! but current month is {0} ".format(month)
raise ValueError(message)
if month in [1, 3, 5, 7, 8, 10, 12]:
total = 31
elif month in [4, 6, 9, 11]:
total = 30
else:
if is_leap(year):
total = 29
else:
total = 28
# logging.warn("total === {0}".format(total))
return total
# print month_total_day(2003, 2)
# print year_total_day(0)
def d_value(srcyear, srcmonth, srcday, destyear, destmonth, destday):
""" temp函数,用于计算两个时间直接相差的天数 比如2016.3.25日 减去 2008.8.8日 等于多少天 :return: 相差的天数 """
if srcyear > destyear or (srcyear == destyear and srcmonth > destmonth) or (
srcyear == destyear and srcmonth > destmonth and srcday > destday):
message = "起始时间不得大于结束时间,这样子是无法比较的:\n" \
"起始时间:{0}/{1}/{2} 结束时间:{3}/{4}/{5}" \
.format(srcyear, srcmonth, srcday, destyear, destmonth, destday)
raise ValueError(message)
else:
# 都回到公元元年吧 1900.1.1 --> 0年的0月0日吧
st = 0
for y in range(0, srcyear):
st += year_total_day(y)
# logging.info("st1 = {0} , y = {1}".format(st,y))
for m in range(1, srcmonth):
st += month_total_day(srcyear, m)
# logging.info("st2 = {0}".format(st))
st += srcday
# logging.info("st = {0}".format(st))
dt = 0
for y in range(0, destyear):
dt += year_total_day(y)
# logging.info("yy = "+str(yy)+ "destday = "+str(destyear))
for m in range(1, destmonth):
dt += month_total_day(srcyear, m)
dt += destday
# logging.info("dt = {0}".format(dt))
return dt - st
def weekday(year, month, day):
""" 获取每天是星期几(基于1900.1.1 是周一) :param year: 2017 :param month: 04 :param day: 02 :return: 1 - 7 ==》周一 - 周日 """
ds = d_value(1900, 1, 1, year, month, day) + 1
weekday_num = ds % 7
return 7 if weekday_num == 0 else weekday_num
# print weekday(2017, 4, 2)
def get_all_lucky():
ret = []
cnt = 0
for year in range(1900, 2000 + 1):
for month in range(1, 12 + 1):
weekday_num = weekday(year, month, 1)
if weekday_num == 1:
cnt += 1
item = (year, month, 1)
ret.append(item)
print "size = {0}".format(cnt)
return ret
p = 0
for it in get_all_lucky():
p += 1
if p % 5 == 0:
print it,