用于计算闰年的Java代码

我正在关注“Java的艺术和科学”一书,它展示了如何计算闰年。 本书使用ACM Java Task Force的库。

这里是书籍使用的代码:

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."); } } } 

我的代码有什么问题,或者我应该使用本书提供的吗?

编辑::上述两个代码工作正常,我想问的是哪个代码是计算闰年的最佳方法。

他们看起来和我一样,但请注意,代码中的这一行有一些冗余:

 else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) 

可以replace为:

 else if (year % 400 == 0) 

如果一个数字是400的倍数,那么它自动也是100和4的倍数。

编辑:( 7年后!)

请注意,上面假设前面的if ((year % 4 == 0) && year % 100 != 0)在原始问题中!

在任何情况下,使用库代码是一个更好的解决scheme,Cletus的答案应该是可以接受的: https ://stackoverflow.com/a/1021373/8331

正确的实现是:

 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; } } 

我build议你把这个代码放到一个方法中,并创build一个unit testing。

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

在unit testing中

 assertTrue(isLeapYear(2000)); assertTrue(isLeapYear(1904)); assertFalse(isLeapYear(1900)); assertFalse(isLeapYear(1901)); 

java.time.Year::isLeap

我想添加新的java.time方法来做到这一点与Year类和isLeap方法:

 java.time.Year.of(year).isLeap() 
 new GregorianCalendar().isLeapYear(year); 

来自维基百科的伪代码翻译成最紧凑的Java

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

从JAVA的GregorianCalendar源代码:

 /** * Returns true if {@code year} is a leap year. */ public boolean isLeapYear(int year) { if (year > changeYear) { return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); } return year % 4 == 0; } 

哪里变化年是朱利安日历成为公历(1582年)。

朱利安历法规定每四年一次的闰年,而公历则省略了不能被400整除的世纪年。

在公历日历文档中,您可以find更多关于它的信息。

最有效的闰年testing:

 if ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0)) { /* leap year */ } 

这是我的详细答案摘自https://stackoverflow.com/a/11595914/733805

重复软件几乎总是错误的。 在任何工程学科中,forms都应该遵循function,并且你有三个分支,有两条可能的path – 不是闰年就是闰年。

在一行上进行testing的机制没有这个问题,但通常最好将testing分成一个函数,该函数接受一个表示一年的int值,并返回一个表示年份是否为闰年的布尔值。 这样你就可以用其他的方式在控制台上打印标准输出,并且可以更容易地进行testing。

在已知超出其性能预算的代码中,通常安排testing,以便它们不是多余的,并按早期返回的顺序执行testing。 维基百科的例子是这样做的 – 大多数年来,你必须计算模400,100和4,但less数你只需要400或400和100模。这是一个性能方面的小优化(最好,只有百分之一input是有效的),但是这也意味着代码重复性较低,程序员input的次数也较less。

如果您使用的是java8:

 java.time.Year.of(year).isLeap() 

以上方法的Java实现:

 public static boolean isLeap(long year) { return ((year & 3) == 0) && ((year % 100) != 0 || (year % 400) == 0); } 

你可以问这个GregorianCalendar类:

 boolean isLeapyear = new GregorianCalendar().isLeapYear(year); 

这是我想出来的。 有一个额外的函数来检查int是否超过强加例外的年份(年$ 100,年%400)。 在1582年之前,这些例外情况并不存在。

 import java.util.Scanner; public class lecture{ public static void main(String[] args) { boolean loop=true; Scanner console = new Scanner( System.in ); while (loop){ System.out.print( "Enter the year: " ); int year= console.nextInt(); System.out.println( "The year is a leap year: "+ leapYear(year) ); System.out.print( "again?: " ); int again = console.nextInt(); if (again == 1){ loop=false; }//if } } public static boolean leapYear ( int year){ boolean leaped = false; if (year%4==0){ leaped = true; if(year>1582){ if (year%100==0&&year%400!=0){ leaped=false; } } }//1st if return leaped; } } 
 public static void main(String[] args) { String strDate="Feb 2013"; String[] strArray=strDate.split("\\s+"); Calendar cal = Calendar.getInstance(); cal.setTime(new SimpleDateFormat("MMM").parse(strArray[0].toString())); int monthInt = cal.get(Calendar.MONTH); monthInt++; cal.set(Calendar.YEAR, Integer.parseInt(strArray[1])); strDate=strArray[1].toString()+"-"+monthInt+"-"+cal.getActualMaximum(Calendar.DAY_OF_MONTH); System.out.println(strDate); } 
  import java.util.Scanner; public class LeapYear { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); System.out.print("Enter the year then press Enter : "); int year = input.nextInt(); if ((year < 1580) && (year % 4 == 0)) { System.out.println("Leap year: " + year); } else { if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) { System.out.println("Leap year: " + year); } else { System.out.println(year + " not a leap year!"); } } } } 

由于维基百科规定闰年的algorithm应该是

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

这里是一个示例程序如何检查闰年 。

你的代码,没有额外的类,似乎不适用于通用Java。 这是一个可以在任何地方工作的简化版本,更倾向于您的代码。

 import java.util.*; public class LeapYear { public static void main(String[] args) { int year; { Scanner scan = new Scanner(System.in); System.out.println("Enter year: "); year = scan.nextInt(); if ((year % 4 == 0) && year % 100 != 0) { System.out.println(year + " is a leap year."); } else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) { System.out.println(year + " is a leap year."); } else { System.out.println(year + " is not a leap year."); } } } } 

在上下文中,您的代码的工作原理也一样,但请注意,本书代码始终有效 ,并且已经过彻底testing。 不是说你的不是。 🙂

最简单的方法是让Java闰年和更清晰的理解enter code here

 import java.util.Scanner; 

class que19 {

 public static void main(String[] args) { Scanner input=new Scanner(System.in); double a; System.out.println("enter the year here "); a=input.nextDouble(); if ((a % 4 ==0 ) && (a%100!=0) || (a%400==0)) { System.out.println("leep year"); } else { System.out.println("not a leap year"); } } 

}

 import javax.swing.*; public class LeapYear { public static void main(String[] args) { int year; String yearStr = JOptionPane.showInputDialog(null, "Enter radius: " ); year = Integer.parseInt( yearStr ); boolean isLeapYear; isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); if(isLeapYear){ JOptionPane.showMessageDialog(null, "Leap Year!"); } else{ JOptionPane.showMessageDialog(null, "Not a Leap Year!"); } } } 
 boolean leapYear = ( ( year % 4 ) == 0 );