【问题标题】:Logic hole with negative numbers in isALeapYear condition in javajava中isALeapYear条件中负数的逻辑漏洞
【发布时间】:2022-11-15 05:13:09
【问题描述】:
public static void main(String[] args){
    boolean year = isLeapYear(9999);
    System.out.println("Is Leap Year: " + year);
}
public static boolean isLeapYear(int year){
    int rem4 = year % 4;
    int rem100 = year % 100;
    int rem400 = year % 400;
    if ((year >= 1 && year <= 9999) && (rem4 == 0) && (rem100 == 0 && rem400 == 0) || (rem100 != 0) && (rem4 == 0)){
        return true;
    }
    return false;
}

当我输入负数年份(到目前为止只有-1024)时,我的范围条件不起作用。 但是,如果我输入任何其他负闰年,它就会起作用(-2020)。所以我不知道我可能遗漏了什么,或者算法的结构是否完全正确。任何帮助将不胜感激。

预期的是,当我输入一个不是闰年的年份时,如果它是一个负闰年,它会返回 false。

【问题讨论】:

  • 问题的症结在于最后一个|| (rem100 != 0 &amp;&amp; rem4 == 0)。由于它之前的其他子句是&amp;&amp;,因此该子句被视为针对全部的条款。 -1024 % 100 != 0 为真,-1024 % 4 == 0 也为真,因此 OR 满足整个 ifif 中的布尔逻辑需要一些工作。
  • 你是不是把括号弄错了?因为在开头使用((,在最后使用)) 并没有多大意义。在这种情况下,您最好只使用一个括号,因为在整个表达式周围加上一个额外的括号并没有任何作用。
  • 考虑将每个条件移动到私有方法以简化所有条件的整体连接。
  • 真的没有负闰年这样的事情。人们怎么会知道距离耶稣诞生的时间是 4 年的倍数?
  • 好吧,从技术上讲there never was a leap year before 1582。 “算法”下的最后几条语句(“闰日”之前)也解决了将该算法预测到早些年的问题,但如果你走得太远,你最终会落入暂时的兔子洞。

标签: java algorithm if-statement leap-year


【解决方案1】:

不太确定,但也许是因为什么时候 || (rem100 != 0) &amp;&amp; (rem4 == 0)) 返回 true 语句,您的整个函数返回 true,否定 if 语句的整个第一部分。

【讨论】:

    【解决方案2】:

    作为||覆盖正面验证部分,只需在条件的另一部分添加相同的验证...

    (year >= 1 && year <= 9999 && rem4 == 0 && rem100 == 0 && rem400 == 0 || year >= 1 && year <= 9999 && rem100 != 0 && rem4 == 0)
    

    【讨论】:

      【解决方案3】:

      我知道简洁明了被认为很酷,但是这种事情通常最好用多个简单的条件来完成。尤其是当你第一次开发它时。

      if (year < 1 || year > 9999)
          return false;
      if (rem4 != 0)
          return false;
      if (rem100 == 0 && rem400 != 0)
          return false;
      return true;
      

      也许:

      if (year >= 1 && year <= 9999)
          if (rem4 == 0) {
              if (rem100 == 0)
                  return (rem400 == 0);
              return true;
      return false;
      

      无论哪种方式都比一个又长又复杂的if 语句更容易调试。

      【讨论】:

        猜你喜欢
        • 2016-04-16
        • 2022-01-12
        • 2021-11-02
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多