闰年是公历中的名词。闰年分为普通闰年和世纪闰年。
普通闰年:公历年份是4的倍数的,且不是100的倍数,为闰年。(如2004年就是闰年);
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是世纪闰年,2000年是世纪闰年);
闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。闰年共有366天(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天)。
凡阳历中有闰日(二月为二十九日)的年;闰余(岁余置闰。阴历每年与回归年相比所差的时日);注意闰年(公历中名词)和闰月(农历中名词)并没有直接的关联,公历中只分闰年和平年,平年有365天,而闰年有366天(2月中多一天);平年中也可能有闰月(如2017年是平年,农历有闰月,闰6月)。
先看一个引例题:
题目描述
给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串)
输入
一个年份
输出
根据是否闰年输出,是输出"L",否输出"N"
样例输入
2000
样例输出
L
代码:
#include<iostream>
#define LEAP_YEAR(year) ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
using namespace std;
int main(){
int y;
cin>>y;
if(LEAP_YEAR(y))cout<<"L"<<endl;
else cout<<"N"<<endl;
return 0;
}
引申:
公历闰年计算
(按一回归年365天5小时48分45.5秒)
1、非整百年:能被4整除,且不是100的倍数的为闰年。(如2004年就是闰年,2001年不是闰年)
2、整百年:能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
3、对于数值很大的年份:这年如果能被3200整除,并且能被172800整除则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能被3200整除,但不能被172800整除)(此按一回归年365天5h48'45.5''计算)。
按一回归年365天5h48'45.5''计算:3200年多出16000小时153600分145600秒 =18600小时26分40秒,现行公历中每400年有97个闰年,3200年共97*8=776个闰年=776*24小时[1] =18624小时 >18600小时,所以只能算到775个闰年,3200不是闰年,于是775*24=18600,多出了26分40秒(共计1600秒),怎么办?需要经历多少个3200年的周期,足够弥补1天(86400秒)?答案是刚好54个周期(86400=1600*54),历时172800(=3200*54)年。
所以对于数值很大的年份的闰年计算: