关于闰年,你不知道的那些事

“四年一闰,百年不闰,四百年再闰”。你知道为什么吗?

判断某一年是否是闰年几乎是所有编程语言的基础练习题之一,而我们必然也熟知其规则:

  • 整除但4不能整除100
  • 整除100又能整除400

这就是俗语中的“四年一闰,百年不闰,四百年再润”,我们当然可以根据这个规则编写程序判断闰年,但你知道为什么这样规定闰年的算法么?


事实上,闰年是为了弥补因人为历法规定,造成的年度天数与地球实际公转周期的时间差而设立的。所以闰年有366天。

那么具体是怎么弥补的呢?

我们知道,平年一年只有365天,而实际上地球绕太阳的公转周期为365天5小时48分46秒。即一回归年。所以公历的每一年都比回归年短0.2422天,四年累计起来,共短0.9688天。

大概就是一天,所以为了弥补这一天的时间差。给2月加上1天,就有了闰年。这样一来,每四年里就有一个闰年,3个平年。这就是四年一闰

那么百年不闰,四百年再闰又是怎么回事呢?

是这样的,刚才说四年累计起来的时间差只有0.9688天,这比我们给闰年增加的一天还少0.0312天,所以每四年就会多出0.0312天。这样400年后,就会比实际天数多出3.12天。所以我们必须在这400年中少设3个闰年。这样公历年的平均长度与回归年就近似了。

那这3个闰年怎么少呢?

很简单,给百年除以400即可,比如2000-2400这400年:

  • 2000/400=5
  • 2100/400=5.25
  • 2200/400=5.5
  • 2300/400=5.75
  • 2400/400=6

可以发现,正好有3个不能整除的整百年。所以规定年份是整百数的必须是400的倍数才是闰年。这就是百年不闰,四百年才闰的规定。

你明白了吗?


当然,根据规则,我们就可以编写代码判断了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main()
{
int year;
cin >> year;

if (year % 4 == 0)
{
if (year % 100 != 0)//1. 能整除4,不能整除100
{
cout << "是闰年\n" << endl;
}
else if ((year % 100==0) && (year % 400==0))//2. 能整除100, 又能整除400
{
cout << "是闰年\n" << endl;
}
else//其它情况不是闰年
{
cout << "不是闰年\n" << endl;
}
}
else//不能整除4就不是闰年
{
cout << "不是闰年\n" << endl;
}
system("pause");
}