Java 中的闰年程序

2025年3月31日 | 阅读 7 分钟

在本教程中,我们将讨论如何识别给定年份是否为闰年。但在继续之前,我们将先讨论闰年。

闰年

闰年,也称为二月年或闰日年,比其他年份多一天(总共 366 天)。通常,它每 4 年出现一次。2008 年、2012 年、2016 年等是闰年的例子。

验证规则

  • 世纪年(以 00 结尾的年份)只有在能被 400 整除时才是闰年。例如,1700 年不是闰年,因为它不能被 400 整除。2000 年是闰年,因为它能被 400 整除。
  • 如果一个非世纪年能被 4 整除,那么它就是闰年。

例如,1996 年是闰年,1999 年不是闰年,因为前者能被 4 整除,而后者不能被 4 整除。

实现:不使用 Scanner 类

观察上述规则的实现。

文件名: LeapYear.java

输出

The year 1996 is a leap year.

The year 1999 is not a leap year.

The year 1700 is not a leap year.

The year 2000 is a leap year.

复杂度分析:程序的 O(1) 时间复杂度。程序的 O(1) 空间复杂度。

实现:使用 Scanner 类

在这里,用户可以灵活地输入自己选择的年份,然后程序会测试输入的数字是否为闰年。此外,我们还可以使用一个 if 语句来完成我们的工作,而不是多个 if 语句。其实现已在下面的程序中说明。

文件名: LeapYear1.java

输出

Enter Year
1996
The year 1996 is a leap year.

Enter Year
1999
The year 1999 is not a leap year.

Enter Year
1700
The year 1700 is not a leap year.

Enter Year
2000
The year 2000 is a leap year.

复杂度分析:程序的 O(1) 时间复杂度。程序的 O(1) 空间复杂度。

实现:查找范围内的闰年

我们还可以借助 for 循环查找给定范围内的闰年。观察下面的程序。

文件名: LeapYear2.java

输出

Finding leap years within the range 2000 and 2150
2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2052 2056 2060 2064 2068 2072 2076 2080 2084 2088 2092 2096 2104 2108 2112 2116 2120 2124 2128 2132 2136 2140 2144 2148

复杂度分析:程序的空间和时间复杂度与前一个程序相同。

实现:使用字符串查找范围

我们还可以将年份转换为字符串并检查闰年。请看以下代码。

文件名: LeapYear3.java

输出

Finding leap years within the range 2000 and 2150
2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2052 2056 2060 2064 2068 2072 2076 2080 2084 2088 2092 2096 2104 2108 2112 2116 2120 2124 2128 2132 2136 2140 2144 2148

复杂度分析:该程序将整数转换为字符串,这需要 O(D) 的时间。此外,程序使用变量 *y* 存储该字符串,这也需要 O(D) 的空间。因此,程序的时间和空间复杂度均为 O(D),其中 D 是我们正在检查闰年的年份中数字的总位数。

注意:与其它实现相比,使用字符串的实现耗费空间和时间最多。但是,如果包含年份的输入数组类型为 String,则此方法可能很有用。