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

闰年的计算


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

闰年

原题

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

解题思路

闰年计算规则:

  1. 四年一闰
  2. 百年不闰
  3. 四百年又闰

程序流程图:


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

用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年为一个周期)

  1. 每个回归年比实际平年多出的秒数:5*3600+48*60+46=20926
  2. 每4年多出的秒数:20926*4=83704
  3. 闰年会多出1天,1天的秒数:24*3600=86400
  4. 每4年少的秒数:86400-83704=2696
由一道闰年程序计算题引发的思考

4年一周期

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

  1. 每100年会有24个闰年
  2. 每100年实际少的秒数:2696*24=64704
  3. 第100年不闰
  4. 每100年的最后4年多出的秒数:20926*4=83704
  5. 每100年多出的秒数:83704-64704=19000
由一道闰年程序计算题引发的思考

100年一周期

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

  1. 在规则二的前提下,400是100的4个周期
  2. 400年会多出的秒数:4*19000=76000
  3. 第400年要闰,会比平年多出一天
  4. 每400年少的秒数:86400-76000=10400
由一道闰年程序计算题引发的思考

400年一周期

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

  1. 在规则三的前提下,3200是400的8个周期
  2. 每3200年少的秒数:10400*8=83200
  3. 3200是400的整数倍,规则四违反了规则三,需要补上一天
  4. 每3200年多出的秒数:86400-83200=3200
由一道闰年程序计算题引发的思考

3200年一周期

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

  1. 在规则四下的前提下,86400是3200的27个周期
  2. 每3200年多出了3200秒
  3. 每86400年多出的秒数:3200*27=86400
  4. 86400秒正好是一天,即86400年要闰
由一道闰年程序计算题引发的思考

86400年一周期

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

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

闰年计算

总结

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


分享到:


相關文章: