如何检查一个数字是否可以被两个不同的值整除?

How to check if a number if divisible by two different values?

我才刚刚上大学,我们要学习的第一件事就是 Java。我目前正在学习 if 语句。对于我的一项家庭作业,我需要编写一个程序,要求用户输入年份。然后,程序需要判断那一年是不是闰年。

题目说如果年份能被4整除就是闰年。另外,如果年份可以被100整除,那么它也应该被400整除才能成为闰年。

这是我到目前为止写的:

        System.out.print("Type a year: ");
        int year = Integer.parseInt(reader.nextLine());

        if (year % 4 == 0 || year % 100 == 0 && year % 400 == 0) {
            System.out.print("The year is a leap year.");
        } else {
            System.out.print("The year is not a leap year.");
        }

我希望程序检查年份是否可以被 4 整除,或者年份是否可以同时被 100 和 400 整除。

现在,当我输入 1800 年时,输出显示该年是闰年,但我希望它说它不是闰年。我怀疑这是因为当其中一个条件为真时 if 语句为真,这是因为 1800 可以被 4 整除。但是,我似乎无法找到正确的方法来做到这一点。将不胜感激。

闰年标准的另一种表达方式是:如果年份可以被 4 整除但不能被 100 整除,或者可以被 400 整除,则为闰年。

这是您的代码中未表达的 "but not by 100" 部分。

示例 1(您的固定代码):

    System.out.print("Type a year: ");
    int year = Integer.parseInt(reader.nextLine());

    if (year % 100 == 0 && year % 400 == 0) || (year % 100 != 0 && year % 4 == 0) {
        System.out.print("The year is a leap year.");
    } else {
        System.out.print("The year is not a leap year.");
    }

示例2(为了更好理解,其他if)

    System.out.print("Type a year: ");
    int year = Integer.parseInt(reader.nextLine());
    boolean isLeap = false;
    if(year % 100 == 0){
        if(year % 400 == 0)
            isLeap = true;
    } else if (year % 4 == 0){
        isLeap = true;
    }
    System.out.print(isLeap ? "The year is a leap year." : "The year is not a leap year.");

你的表达是在问 "Is year a multiple of four or is it a multiple of 100 and also a multiple of 400?" 后半部分完全是多余的,因为 100 和 400 的任何倍数一开始就已经是 4 的倍数(400 和 100 也一样),结果是显然比您预期的更具包容性。

请记住,一系列 AND 条件将限制匹配的场景,而 OR 将扩大它。因此,从找到 4 的倍数开始,然后通过添加关于 100 的倍数的次要条件来改进它。

year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) /* right! */

由于 A(B+C) 在布尔逻辑中等同于 AB+AC,您还可以扩展它,它可能对您来说读起来更清楚:

(year % 4 == 0 && year % 100 != 0) || (year % 4 == 0 year % 400 == 0) /* expanded */

括号并不是必需的,但为了清楚起见,我保留了它们。

另一种可能有助于您思考这一点的观点是反转条件以找到 不是 闰年的年份。它在结构上与您尝试的结构非常相似,因此我认为研究它可能会让您了解您的思维过程哪里出了问题:

year % != 0 || (year % 100 == 0 && year % 400 != 0) /* NON-leap years */

最后,要指出的最后一件事是,只有 OR 的任一侧为真,整个表达式才为真。回顾您的原始逻辑,一旦程序确定 year % 4 == 0 为真,其余部分就是不需要执行的额外工作。该程序实际上会跳过这些步骤,这个概念称为短路

因为任何可被 400 或 100 整除的数字显然都可以被 4 整除。我们需要添加额外的检查以确保年份是闰年

class Scratch {

  public static void main(String[] args) {

    for (int i = 1800; i <= 2000; i++) {
      if (i % 4 == 0) {
        if ((i % 100 == 0 && i % 400 == 0) || (i % 100 != 0)) {
          System.out.println(i + ": A leap Year");
        } else {
          System.out.println(i + ": Not a leap year");
        }
      } else {
        System.out.println(i + ": Not a leap year");
      }
    }
  }
}