【问题标题】:Proving that this code is finding if the year is a leap year [duplicate]证明此代码正在查找年份是否为闰年 [重复]
【发布时间】:2017-05-20 09:50:34
【问题描述】:

我必须编写一个代码来告诉我公历的特定年份是否是闰年。但是我不确定该代码是否适用于每年。它适用于 1900、1901、2000。

在我粘贴代码之前,也许你应该知道是什么让公历年成为闰年:如果年模 4 等于 0,那么它就是闰年,如果年 % 4 = 0 和年 % 100 = 0 那么它不是。最后,如果 year % 4 = 0 并且 year % 100 = 0 并且 year % 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;
    }

}

谢谢

【问题讨论】:

  • 还有什么问题?
  • 观察:片段(year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)可以简化为(year%400==0)(因为任何400的倍数必然是4和100的倍数)。
  • 再检查几年。它适用于2016年吗? 2017 年? 1600? 1601?您测试的案例越多,您的信心就越大。这就是单元测试的本质。如果你仍然不确定,问问自己为什么,如果你的怀疑是合理的,那么就想出更多的测试用例来缓解它们。

标签: java leap-year


【解决方案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)和(年 % 100 != 0)
  • (年 % 4 == 0)与(年 % 100 == 0)与(年 % 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)

从这里可以直接与我们从您问题中的代码中提取的逻辑进行比较,并验证是的,该代码正确识别了 Wikipedia 定义的闰年

如果比较看起来不是那么“直截了当”,您可以求助于truth tables,并详尽地证明这两个逻辑语句是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2022-12-10
    • 1970-01-01
    相关资源
    最近更新 更多