Java代码计算闰年Java代码计算闰年(Java Code for calculating Lea

2019-05-13 14:16发布

我下面的书“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