如果年份是闰年,则证明此代码正在查找

时间:2016-11-30 14:44:47

标签: java leap-year

我必须写一个代码,告诉我格里高利历的特定年份是否是闰年。但是我不确定代码是否会每年都有效。它适用于1900年,1901年,2000年。

在我粘贴代码之前,也许你应该知道什么使格里高年成为闰年:如果模4的年份等于0,那么它是闰年,如果年%4 = 0且年%100 = 0则不是。最后,如果年份%4 = 0且年份%100 = 0且年份%400 = 0,那么它就是。

以下是代码:

 public static boolean isLeapYearGregorian(int year) {
    if ((year % 4 == 0) && (year % 100 != 0) || (year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) {
        return true;
    }
    else {
        return false;
    }

}

由于

1 个答案:

答案 0 :(得分:1)

对于记录,代码可以简单地写成

public static boolean isLeapYearGregorian(int year) {
  return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
}

但是为了接近OP的代码,让我们从这开始:

public static boolean isLeapYearGregorian(int year) {
  return (year % 4 == 0) && (year % 100 != 0) || (year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0);
}

此时,您需要知道operator precedence in Java,因为上面的ands(&&)和ors(||)处于同一级别,这会产生影响。简短回答:AND出现在OR之前。

现在逻辑可以列为:

  • (年%4 == 0)AND(年%100!= 0)
  • (年%4 == 0)AND(年%100 == 0)AND(年%400 == 0)

这就是说:

  • (可被4整除的年份)AND(年份不能被100整除)
  • (可被4整除的年份)AND(可被100整除的年份)AND(可被400整除的年份)

现在您可以将逻辑与definition of a Gregorian calendar leap year的伪代码进行比较:

if (year is not divisible by 4) then (it is a common year)
else if (year is not divisible by 100) then (it is a leap year)
else if (year is not divisible by 400) then (it is a common year)
else (it is a leap year)

从这里可以直接与我们从您的问题中的代码中提取的逻辑进行比较,并验证是代码正确识别闰年,如维基百科所定义。

如果比较看起来不那么“直截了当”,你可以诉诸truth tables,并详尽地证明这两个逻辑陈述是相同的。

truth table of leap year identification