闰年(Leap Year)是公历中的名词,是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。闰年共有366天。闰年分为普通闰年和世纪闰年。
公元后闰年计算
普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年。(如2004年是闰年,2001年不是闰年);
世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是闰年,2000年是闰年);
实际上对于数值很大的年份:这年如果能被3200整除,并且能被172800整除则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能被3200整除,但不能被172800整除)
公元前闰年计算
根据闰年算法,公元4年是闰年,且周期是4年,如果公元有0年,即为闰年。因为公元没有0年,那公元前1年就是是闰年。
普通闰年:年数除以4余数为1是闰年,即公元前1、5、9……是闰年;
世纪闰年:年数除以400余数为1是闰年,即公元前401、801……是闰年;
对于数值很大的年份:年数除以3200余数为1则不是闰年且年数除以172800余1又为闰年,即公元前172801……是闰年,864001……年不是闰年。
1950-2050年间的闰年:
1952、1956、1960、1964、1968、1972、1976、1980、1984、1988、1992、1996、2000、2004、2008、2012、2016、2020、2024、2028、2032、2036、2040、2044、2048。
下面仅给出公元后的闰年的判定方法,支持公元前闰年判定的程序自行完善。
def leap(year):
"""输入表示年份的非 0 整数,返回该年是否是闰年,返回布尔值"""
if (year % 172800 == 0 and year % 3200 == 0) or (year % 400 == 0) or (year % 100 != 0 and year % 4 == 0):
return True
else:
return False
def print_leap(start, stop):
for year in range(start, stop + 1): # 遍历给定年份之间的每一年
if leap(year): # 如果该年是闰年,输出年份数字
print(year, end=' ')
# 输入输出放到if __name__ == "__main__":下面,使本模块可以被其他程序导入,调用其中的leap()函数
if __name__ == "__main__":
m = int(input())
n = int(input())
print_leap(min(m, n), max(m, n))
# 输入:1950
# 输入:2020
# 输出:1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020
闰年的判定也可以分步实现。注意代码中尽可能构造一组if…elif…else语句,判定时注意取模的顺序:
# 定义一个判定闰年的函数,输入一个代表年份的整数,返回True 或False
def leap(year):
if year % 3200 == 0 and year % 172800 == 0:
return True
elif year % 400 == 0:
return True
elif year % 100 != 0 and year % 4 == 0:
return True
else:
return False