我下面的书“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.");
}
}
}
这有什么错我的代码或我应该使用经书所提供的一个?
编辑::上述两个代码的工作正常,我想问的是代码为计算闰年的最佳途径。
Answer 1:
他们看起来是一样的我,虽然注意,这行代码有一定的冗余度:
else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0))
可以被替代为:
else if (year % 400 == 0)
如果数是400的倍数然后它自动也是100和4的倍数。
编辑:(7年后的今天!)
请注意,在上述假定前述的存在if ((year % 4 == 0) && year % 100 != 0)
从原来的问题!
克莱的答案应该被接受的一个: https://stackoverflow.com/a/1021373/8331
(我想删除我自己的答案,但我不能,因为它是接受了)
Answer 2:
正确的实现是:
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;
}
}
Answer 3:
我建议你把这个代码放到一个方法,并创建一个单元测试。
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));
Answer 4:
java.time.Year::isLeap
我想补充的新java.time
用这样的方式Year
类和isLeap
方法:
java.time.Year.of(year).isLeap()
Answer 5:
new GregorianCalendar().isLeapYear(year);
Answer 6:
维基百科伪代码翻译成最紧凑的Java
(year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))
Answer 7:
最有效的闰年测试:
if ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0))
{
/* leap year */
}
这是从我详细的解答在摘录https://stackoverflow.com/a/11595914/733805
Answer 8:
从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;
}
凡changeYear是当年罗马儒略历变成公历(1582年)。
儒略历指定闰年每四年,而公历省略世纪年份不属于被400整除。
在公历的文档 ,你可以找到关于它的更多信息。
Answer 9:
这几乎总是错的有重复的软件。 在任何工程学科,形式追随功能,和你有什么东西有两个可能的路径三个分支 - 这是无论是闰年。
其中有测试在同一行的机制没有这个问题,但通常会更好地测试分成这需要较去年一个int并返回boolean代表年份是否是闰年的功能。 这样,你可以用它做什么其他打印到标准输出在控制台上,并且可以更轻松地对其进行测试。
在这被称为超过其绩效预算代码,这是通常的,让他们不重复安排的测试,并在其早期的返回顺序进行测试。 维基百科的例子做到这一点 - 大多数年份你算算模400100和4,但对于一些只需要模400,400和100这是在性能方面(充其量只是一个小的优化,只有百分之一输入实现的),但它也意味着码具有较少的重复,并有较少的为程序员提供了输入。
Answer 10:
如果您正在使用java8:
java.time.Year.of(year).isLeap()
Java实现上述方法:
public static boolean isLeap(long year) {
return ((year & 3) == 0) && ((year % 100) != 0 || (year % 400) == 0);
}
Answer 11:
你可以问的GregorianCalendar这个类:
boolean isLeapyear = new GregorianCalendar().isLeapYear(year);
Answer 12:
这是我想出了。 存在添加的功能检查,看看是否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;
}
}
Answer 13:
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);
}
Answer 14:
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!");
}
}
}
}
Answer 15:
由于维基百科指出算法为闰年应
(((year%4 == 0) && (year%100 !=0)) || (year%400==0))
下面是一个示例程序如何检查闰年 。
Answer 16:
您的代码,因为它是,没有额外的类,不会出现普遍的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.");
}
}
}
}
您的代码,在上下文中,效果一样好,但要注意的是本书的代码始终工作 ,并经过全面的测试。 不是说你的不是。 :)
Answer 17:
TA使Java闰年最简单的方式也更加清晰了解enter code here
import java.util.Scanner;
类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");
}
}
}
Answer 18:
随着课程: https://tmc.mooc.fi ,该演习之一是这种问题,我写了这样的回答:
import java.util.Scanner;
public class LeapYear {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.println("Type a year: ");
int year = Integer.parseInt(reader.nextLine());
if (year % 400 == 0 && year % 100 == 0 && year % 4 == 0) {
System.out.println("The year is a leap year");
} else
if (year % 4 == 0 && year%100!=0 ) {
System.out.println("The year is a leap year");
} else
{
System.out.println("The year is not a leap year");
}
}
}
Answer 19:
这个答案是伟大的,但它会为几年前基督(使用proleptic公历)无法正常工作。 如果你想让它为BC年工作,那么请使用以下改编:
public static boolean isLeapYear(final int year) {
final Calendar cal = Calendar.getInstance();
if (year<0) {
cal.set(Calendar.ERA, GregorianCalendar.BC);
cal.set(Calendar.YEAR, -year);
} else
cal.set(Calendar.YEAR, year);
return cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365;
}
您可以通过考虑当年-5(即4年)的发音应该是闰年假设proleptic公历验证自己。 同样的,今年1(前一年1个AD)。 链接的回答,而上述调整代码做不处理这种情况。
Answer 20:
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!");
}
}
}
Answer 21:
boolean leapYear = ( ( year % 4 ) == 0 );
文章来源: Java Code for calculating Leap Year