用于计算闰年的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 */ }
重复软件几乎总是错误的。 在任何工程学科中,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 );