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.");
}
}
}
Что-то не так с моим кодом, или я должен использовать тот, который предоставляется в книге?
EDIT:: Оба вышеуказанного кода работают нормально, я хочу спросить, какой код является лучшим способом для вычисления високосного года.
Ответы
Ответ 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)
из исходного вопроса!
Ответ cletus должен быть принят: fooobar.com/questions/183666/...
(Я бы удалил свой собственный ответ, но я не могу, так как он принят)
Ответ 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;
}
}
Ответ 3
Я предлагаю вам поместить этот код в метод и создать unit test.
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 test
assertTrue(isLeapYear(2000));
assertTrue(isLeapYear(1904));
assertFalse(isLeapYear(1900));
assertFalse(isLeapYear(1901));
Ответ 4
java.time.Year::isLeap
Я хотел бы добавить новый java.time
способ сделать это с помощью класса Year
и метода isLeap
:
java.time.Year.of(year).isLeap();
Ответ 5
new GregorianCalendar().isLeapYear(year);
Ответ 6
Псевдокод из Википедии переведен на самую компактную Java
(year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))
Ответ 7
Самый эффективный тест на летнее время:
if ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0))
{
/* leap year */
}
Это отрывок из моего подробного ответа на fooobar.com/questions/34564/...
Ответ 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.
В документации по григорианскому календарю вы можете найти дополнительную информацию об этом.
Ответ 9
Почти всегда неправильно повторять в программном обеспечении. В любой инженерной дисциплине форма должна следовать функции, и у вас есть три ветки для чего-то, что имеет два возможных пути - это либо високосный год, либо нет.
Механизм, который имеет тест в одной строке, не имеет этой проблемы, но, как правило, было бы лучше разделить тест на функцию, которая принимает int, представляющую год, и возвращает логическое значение, представляющее, является ли год високосный год. Таким образом, вы можете что-то сделать с этим другим, который печатает на стандартный вывод на консоли и может более легко протестировать его.
В коде, который, как известно, превышает его бюджет производительности, обычно организует тесты, чтобы они не были избыточными и выполняли тесты в порядке, который возвращается раньше. Пример wikipedia делает это - в течение многих лет вы должны вычислять по модулю 400 100 и 4, но для нескольких вам нужно только по модулю 400 или 400 и 100. Это небольшая оптимизация с точки зрения производительности (в лучшем случае только одна из сотни входы), но это также означает, что код имеет меньшее повторение, и там меньше для программиста ввести.
Ответ 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);
}
Ответ 11
Вы можете задать GregorianCalendar для этого:
boolean isLeapyear = new GregorianCalendar().isLeapYear(year);
Ответ 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;
}
}
Ответ 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);
}
Ответ 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!");
}
}
}
}
Ответ 15
В качестве wikipedia алгоритм состояния для високосного года должен быть
(((year%4 == 0) && (year%100 !=0)) || (year%400==0))
Вот пример программы как проверить високосный год.
Ответ 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.");
}
}
}
}
Ваш код, в контексте, работает так же хорошо, но обратите внимание, что книжный код всегда работает и тщательно протестирован. Не сказать, что твой нет.:)
Ответ 17
Самый простой способ сделать 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");
}
}
}
Ответ 18
С курсом: TestMyCode
Программист оценки заданий, что одним из упражнений была такая проблема, я написал такой ответ:
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");
}
}
}
Ответ 19
этот ответ великолепен, но он не сработает в течение многих лет до Рождества Христова (используя проглептический григорианский календарь). Если вы хотите, чтобы он работал на протяжении 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 г. до н.э.) следует произносить как високосный год, предполагая, что у нас есть пролептический григорианский календарь. То же самое с годом -1 (годом до 1 года нашей эры). Связанный с ответом не обрабатывает этот случай, в то время как вышеупомянутый адаптированный код делает.
Ответ 20
boolean leapYear = ( ( year % 4 ) == 0 );
Ответ 21
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!");
}
}
}