019. 计算星期天的数量(counting Sundays)

以下信息是题目直接给予你的,当然你也可以自己做一些研究:1900年1月1日是星期一,一月有30天的月份分别为九月、四月、六月与十一月,除开二月以外其它月份都有31天。二月在闰年有29天,其它年份有28天。闰年是年份可以整除四的年份,除非这个年份跨世纪的年份,但在跨世纪的年份中如果该年份可以整除400则也为闰年。在20世纪(1900年1月1日至2000年12月31日)每个月的首日是星期天的次数是多少?

分析:本题可以使用python中datetime模块解决,从1990年1月1日开始循环至2000年12月31日结束,如果某天同时为一个月的第一天且是星期天,则计数加一,这样便可以统计出整个二十世纪符合条件的天数。事实上存在一个计算任意日期是星期几的算法,叫作Zeller's congruence,感兴趣的读者可以研究一下。使用这个算法,也可以解决这里的问题。

# time cost = 6.46 ms ± 10.9 µs

import datetime as dt

def count_sundays():
    delta = dt.timedelta(days=1)
    start_date = dt.datetime(1901, 1, 1)
    end_date = dt.datetime(2000, 12, 31)
    count = 0
    while start_date <= end_date:
        if start_date.day==1 and start_date.isoweekday()==7: count+=1
        start_date += delta
    return count