有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

计算闰年的Java代码

我正在阅读《Java的艺术与科学》一书,它展示了如何计算闰年。 这本书使用了ACM Java任务组的库

以下是本书使用的代码:

import acm.program.*;

public class LeapYear extends ConsoleProgram {
    public void run()
    {

        println("This program calculates leap year.");
        int year = readInt("Enter the year: ");     

        boolean isLeapYear = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));

        if (isLeapYear)
        {
            println(year + " is a leap year.");
        } else
            println(year + " is not a leap year.");
    }

}

现在,这就是我计算闰年的方法

import acm.program.*;

public class LeapYear extends ConsoleProgram {
    public void run()
    {

        println("This program calculates leap year.");
        int year = readInt("Enter the year: ");

        if ((year % 4 == 0) && year % 100 != 0)
        {
            println(year + " is a leap year.");
        }
        else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0))
        {
            println(year + " is a leap year.");
        }
        else
        {
            println(year + " is not a leap year.");
        }
    }
}

我的代码有什么问题吗?还是应该使用书中提供的代码

编辑::以上两种代码都很好,我想问的是哪种代码是计算闰年的最佳方法


共 (6) 个答案

  1. # 1 楼答案

    维基百科中的伪代码被翻译成最紧凑的Java

    (year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))
    
  2. # 2 楼答案

    我建议您将此代码放入一个方法中,并创建一个单元测试

    public static boolean isLeapYear(int year) {
        assert year >= 1583; // not valid before this date.
        return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
    }
    

    在单元测试中

    assertTrue(isLeapYear(2000));
    assertTrue(isLeapYear(1904));
    assertFalse(isLeapYear(1900));
    assertFalse(isLeapYear(1901));
    
  3. # 3 楼答案

    正确的实施方式是:

    public static boolean isLeapYear(int year) {
      Calendar cal = Calendar.getInstance();
      cal.set(Calendar.YEAR, year);
      return cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365;
    }
    

    但如果你打算重新发明这个轮子,那么:

    public static boolean isLeapYear(int year) {
      if (year % 4 != 0) {
        return false;
      } else if (year % 400 == 0) {
        return true;
      } else if (year % 100 == 0) {
        return false;
      } else {
        return true;
      }
    }
    
  4. # 4 楼答案

    java.time.Year::isLeap

    我想用^{}类和^{}方法添加新的^{}方法:

    java.time.Year.of(year).isLeap();
    
  5. # 5 楼答案

    new GregorianCalendar().isLeapYear(year);