0. 所谓年

一般来说,“年”指的是,地球在公转轨道上绕行一周,又回到原来位置所花费的时间,这个过程大约是365.2564天。这个数字本身没什么问题,但如果用在历法中,就会出错。因为地球自转轴的存在和变化,每过365.2564天,地球虽然在公转轨道上的位置相同,但是每次太阳对于地球上一个固定位置的影响是有区别的,这直接就会影响到农业生产 。人们制定历法,就是为了服务农业生产,到什么节气做什么事,都是根据经验来的。可现在,每年春分具体的时间点是有区别的,这肯定不行。

聪明的劳动人民慢慢发现,一个春分到下一次春分所经历的时间,实际上比地球公转周期要短一些,所以,历法中采用的“年”是回归年,考虑了地球自转轴的影响,一个回归年大约是365.2422天。

1. 为什么“闰”

一个回归年是365.2422天,但是人们过日子总不能用小数算天吧。

今天是周一,4.8575天后又放假了,真开心。
老王上次找我借钱,说的是30.5367天之后还我,利息是xxx。

这好像实在不是很方便。

所以,一年还是得按365天计算(向下取整)。那么,每年,我们就少计算了0.2422天。4年后,就会累计少计算0.9688天,为了弥补这种差距,人们每4年,增加一天,这年就有366天!这就是4年一闰。

每4年加一天的话,这就多计算了$1 - 0.9688 = 0.0312$天,100年后,就会多计算 $ 0.0312 * 25 = 0.78 $ 天,所以,人们每100年,就再减去一天(第100年不闰)。

这样,每100年,就会少算0.22天(100年闰的话会多算0.78天,如果最后一个年不闰的话,就减去1天)。那么400年就少算了0.88天,所以,到第400年的时候,还是得加1天把这个误差往回找找,不能偏差的太多。这样的话,虽然0.88的误差找回来的,但是这样又多计算了0.12天。

每400年多计算0.12天,3200年就多计算了0.96天,这误差又很大了,还是得减1天往回找补找补。所以,每3200年还是不能算作闰年。

到这,有人可能会说

3200年 少计算了0.04天,25个3200年,也就是第80000年的时候,正好少算了1整天。那就加1天,第80000年闰一下!误差不就归零了吗!

其实,这样往下继续算好像也没啥问题,关键是,在上边的流程中,我们每年是按365.2422天计算的,可这只是一个近似值,在较短的时间内,用它来算一算,有误差好像也不会影响太大。但拉长时间尺度后再看的话,这里微小的误差,对结果的影响应该是不可忽略的。
再者,现在人类的平均寿命不过百年,80000年对我们来说,太过久远。
还有,随着人类文明的发展,后边还会不会在地球上继续生活,还不好说,也许,到了另一个星球,又是另一个闰法了。

最后,如果给定一个年份是x的话,x要满足下列条件才能算作是闰年(起码在3200年以内,这样算好像问题也不大)


bool func(int x)
{
    if(x % 4 != 0) return false;
    if(x % 3200 == 0) return false;
    if(x % 400 == 0) return true;
    if(x % 100 == 0) return false;
    return true;
}