【问题标题】:Having problems with detecting leap year检测闰年有问题
【发布时间】:2014-06-11 23:48:15
【问题描述】:

avHi 再次, 感谢大家对我上一个问题的帮助。

但是现在我遇到了另一个问题

int main ()
    {
        int inputSeconds,seconds, minutes, hours , days ,years ;
        int remainingSeconds ;
        int current_year = 1970;
        int current_month = 1;
        int current_day = 1;
        const int standard_year = 365;
        const int leap_year = 366;
        bool leapYear;
        int leapcounter  ; //Since 1972 is the next closest leap year, counter is set to 2


        cout << "Welcome to Epoch time/ Data converter" << endl;
        cout << "Enter Number of Seconds Since Midnight Jan 1, 1970: ";
        cin >> inputSeconds ;


        //Convert seconds into days to determine the number of years that has already passed


        days = inputSeconds/(60*60*24) ;
        remainingSeconds = inputSeconds % (60*60*24) ;


        cout << days << endl; 
        //Determine current year 

            while (!(days < 365))
            {
            if (leapcounter == 3 )
                {
                    current_year++;
                    days -= leap_year;
                    leapYear = true;
                    leapcounter = 0;

                }
            else
                {


                    current_year++;
                    days -= standard_year;
                    leapcounter++;  
                    leapYear = false;

                }
            } 


            //Check if current year is leap year or not

            if ((current_year % 4 == 0) && (current_year % 100 == 0) || (current_year % 400 == 0))
                leapYear = true;
            else
                leapYear = false;



        cout << current_year << " days remaining :" << days << " Leap year? " << leapYear << " Remaining seconds :" << remainingSeconds;

        return 0;

}

它似乎没有检测到输出的闰年。 我试过 1972、2004、2008 和 2012。

我似乎无法找出问题所在,希望您能帮助阐明我的问题 先感谢您。

【问题讨论】:

  • 在您的程序中,您声明用户必须输入自 UNIX 纪元以来的秒数。你如何进入你的时代?如 1972 年、2004 年等?或者,作为 UNIX 时间戳?
  • 在 unix 时间 ,1325376000 等

标签: c++ epoch leap-year


【解决方案1】:

current_year 决定闰年的逻辑比你所拥有的要复杂一些。

必须是:

if ((current_year % 4 == 0) )
{
  if ( (current_year % 100 == 0) )
  {
     if ( (current_year % 400 == 0) )
     {
        leapYear = true;
     }
     else
     {
        leapYear = false;
     }
  }
  else
  {
     leapYear = true;
  }
}
else
{
  leapYear = false;
}

进一步思考,该逻辑可以简化为:

leapYear = ( (current_year % 400) == 0 ||
             ( (current_year % 4) == 0 && (current_year % 100) != 0)) ;

此外,您需要将leapcounter 初始化为2,因为1 对应于1970 的第一天——距上一个闰年2 年。

【讨论】:

  • 是的!那成功了。谢谢。你介意解释一下为什么 if 必须这样扩展吗?
  • 您那里的代码有点冗长,请参阅我的答案以获得更简洁的内容。
【解决方案2】:

给你:

bool IsALeapYear(int year) {
    return (!(year % 4) && (year % 100)) || !(year % 400);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2022-10-13
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多