1. 问题描述:
1949年的国庆节(10月1日)是星期六。 今年(2012)的国庆节是星期一。那么,从建国到现在,有几次国庆节正好是星期日呢?只要答案,不限手段!可以用windows日历,windows计算器,Excel公式,。。。。。当然,也可以编程!不要求写出具体是哪些年,只要一个数目!千万不要提交源代码!答案不要写在这里,写在“解答.txt”中
2. 思路分析:
这道题目其实有两种做法,第一种做法是通过"翻日历"的方法,实现天数的累加更新当前的日期,判断当前天数是否是否国庆节而且是星期日对满足条件的日期进行计数即可(涉及到的细节会比较多很可能会存出错),第二种做法是使用循环计算相邻两年的国庆距离多少天,这个时候就需要计算当前这一年是平年还是闰年了,如果是平年那么国庆这一天相差365天,如果是闰年那么相差366天,而且一个很重要的一点是如果两个日期相差7天那么这两个日期的星期是一样的,例如下面的20日与27日相差7天那么这两天的星期是一样的,因为7天就为一个周期:
所以我们只需要计算上一年与当前遍历的年份相差的天数,然后对7进行取余,余数是几那么就在上一年的国庆是周几的基础上往后推几天即可,例如上一年国庆是周六,上一年国庆与当前这一年国庆相差365天,365 % 7 = 1,那么这一年国庆的星期就为上一年的周六往后推一天也就是这一年的国庆是周日。综上我们只需要循环遍历年份,计算上一年与当前这一年相差的天数,如果是平年那么为上一年国庆的星期上推后一天,如果为闰年那么为上一年国庆的星期的推后两天即可,(其实就是以7为周期两个日期的星期是不变的,已知当前星期那么计算两个日期相差多少天即可知道下一个日期的星期 ):365 % 7 = 1 366 % 7 = 2,更推荐第二种方法因为细节比较少更容易处理
3. 代码如下:
# 判断是否是闰年
def isLeap(year: int):
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
if __name__ == '__main__':
count = 0
week = 6
for i in range(1950, 2013):
if isLeap(i):
# 与366 % 7 = 2是一样的
week += 2
else:
# 与365 % 7 = 1是一样的
week += 1
# 余数为0那么就为周日
if week % 7 == 0:
# print(i)
count += 1
print(count)