由一道闰年程序计算题引发的思考

闰年的计算


闰年

原题

找出2000-2500年内所有的闰年

解题思路

闰年计算规则:

四年一闰百年不闰四百年又闰

程序流程图:


用C++语言描述:

<code>#include using namespace std; int main() { int y=2000; while(y<=2500) { if((y%4==0&&y%100!=0)||y%400==0) { cout

代码截图


部分运行结果


由原题引发的思考

经查阅,一个回归年的周期(即地球绕太阳转一周的时间)为365天5小时48分46秒。也就是说地球每公转一周,就会比实际的平年多出

5小时48分46秒,即20926秒(5*3600+48*60+46)。而每个闰年会比每个平年多出一天,即86400秒(24*3600秒)。

在以上前提下,我们对闰年计算规则进行分析。为计算方便,现将所有的时间单位,都换算成秒。

规则一:四年一闰(以4年为一个周期)

每个回归年比实际平年多出的秒数:5*3600+48*60+46=20926每4年多出的秒数:20926*4=83704闰年会多出1天,1天的秒数:24*3600=86400每4年少的秒数:86400-83704=2696

4年一周期

规则二:四年一闰,百年不闰(以100年为一个周期)

每100年会有24个闰年每100年实际少的秒数:2696*24=64704第100年不闰每100年的最后4年多出的秒数:20926*4=83704每100年多出的秒数:83704-64704=19000

100年一周期

规则三:四年一闰,百年不闰,四百年又闰(以400年为一个周期)

在规则二的前提下,400是100的4个周期400年会多出的秒数:4*19000=76000第400年要闰,会比平年多出一天每400年少的秒数:86400-76000=10400

400年一周期

规则四:四年一闰,百年不闰,四百年又闰,3200年不闰(以3200年为一个周期)

在规则三的前提下,3200是400的8个周期每3200年少的秒数:10400*8=832003200是400的整数倍,规则四违反了规则三,需要补上一天每3200年多出的秒数:86400-83200=3200

3200年一周期

规则五:四年一闰,百年不闰,四百年又闰,3200年不闰,86400年要闰(以86400年为一个周期)

在规则四下的前提下,86400是3200的27个周期每3200年多出了3200秒每86400年多出的秒数:3200*27=8640086400秒正好是一天,即86400年要闰

86400年一周期

至此闰年的计算规则已分析完毕。

闰年计算

总结

以上的闰年算法,是基于一个回归年的周期为365天5小时48分46秒前提计算的。如果没有这个条件,该算法得出的值是存在问题的。由于地球和太阳乃至整个宇宙,都是在不断运动的,所以在遥远的未来一个回归年的周期,不一定是365天5小时48分46秒。但在你有生之年,以上算法是行之有效的。