Високосный год программа 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."); >> > 

Что-то не так с моим кодом, или я должен использовать тот, который предоставляется в книге?

Читайте также:  Javascript получить имя домена

EDIT:: Оба вышеуказанного кода работают нормально, я хочу спросить, какой код является лучшим способом для вычисления високосного года.

ОТВЕТЫ

Ответ 1

Они выглядят одинаково для меня, хотя обратите внимание, что эта строка в вашем коде имеет некоторую избыточность:

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

Если число кратно 400, тогда оно автоматически также кратно 100 и 4.

редактировать: (7 лет спустя!)

Обратите внимание, что вышеупомянутое предполагает наличие предыдущего if ((year % 4 == 0) && year % 100 != 0) из исходного вопроса!

(Я бы удалил свой собственный ответ, но я не могу, так как он принят)

Ответ 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); > 
assertTrue(isLeapYear(2000)); assertTrue(isLeapYear(1904)); assertFalse(isLeapYear(1900)); assertFalse(isLeapYear(1901)); 

Ответ 4

java.time.Year::isLeap

Я хотел бы добавить новый java.time способ сделать это с помощью класса 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 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-реализация вышеуказанного метода:

public static boolean isLeap(long year)

Ответ 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)

Ответ 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

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!"); >> > 

Источник

Как вычислить, является ли год високосным в Java

Статьи по Java

При работе с датами в Java может быть полезно вычислить, является ли год високосным или нет.

Високосный год – это год, состоящий из 366 дней вместо 365.

Високосный (или високосный) год выпадает каждые четыре года, чтобы компенсировать неточность традиционного календаря: вращение земли вокруг солнца, на самом деле, длится не ровно 365 дней, а примерно 365 дней и 6 часов, и по этой причине в 1584 году было решено добавлять один день каждые 4 года, чтобы компенсировать отставание, накопленное за предыдущие три года.

Как узнать, является ли год високосным или нет?

На самом деле для ответа на этот вопрос достаточно небольшого математического расчета.

Давайте рассмотрим простую функцию Java, которая позволяет определить, является ли год високосным или нет:

public class Leapyear < public static void main(String[] args) < System.out.print("Введите год (например, 2021): "); int year = Input.readInt(); boolean leapyear = ( year > 1584 && ( (year % 400 == 0) || (year %4 == 0 && year % 100 != 0) ) ); if (leapyear) System.out.println("Год " + year + " високосный"); else System.out.println("Год " + year + " не високосный"); > >
Code language: PHP (php)

Как видно из предложенного кода, чтобы определить, является ли год високосным, достаточно проверить ряд условий:

  • год должен быть больше, чем 1584 (в котором был введен високосный год)
  • А также:
    • год должен быть кратен 400
    • или год должен быть кратен 4, но не 100.

    При наличии этих условий год является високосным.

    Источник

    Нахождение високосных лет в Java

    В этом руководстве мы покажем несколько способов определить, является ли данный год високосным в Java.

    Високосный год – это год, который делится на 4 и 400 без остатка . Таким образом, годы, которые делятся на 100, но не делятся на 400, не подходят, даже если они делятся на 4.

    2. Использование API календаря до Java-8

    Начиная с Java 1.1, класс GregorianCalendar позволяет нам проверять, является ли год високосным:

     public boolean isLeapYear(int year); 

    Как и следовало ожидать, этот метод возвращает значение true , если данный год является високосным, и значение false , если год не является високосным .

    Годы до нашей эры (до Рождества Христова) должны передаваться как отрицательные значения и рассчитываются как 1 – год . Например, 3 год до н.э. представлен как -2, поскольку 1 – 3 = -2.

    3. Использование API даты/времени Java 8+

    Java 8 представила java . time с гораздо лучшим API даты и времени .

    Класс Year в java . time имеет статический метод для проверки того, является ли данный год високосным:

     public static boolean isLeap(long year); 

    И у него также есть метод экземпляра, чтобы сделать то же самое:

    4. Использование API Joda-Time

    Joda -Time API — одна из наиболее часто используемых сторонних библиотек среди проектов Java для утилит даты и времени. Начиная с Java 8, эта библиотека находится в поддерживаемом состоянии , как указано в исходном репозитории Joda-Time GitHub .

    Не существует предопределенного API-метода для поиска високосного года в Joda-Time. Однако мы можем использовать их классы LocalDate и Days для проверки високосного года:

     LocalDate localDate = new LocalDate(2020, 1, 31);   int numberOfDays = Days.daysBetween(localDate, localDate.plusYears(1)).getDays();    boolean isLeapYear = (numberOfDays > 365) ? true : false; 

    5. Вывод​

    В этом руководстве мы увидели, что такое високосный год, логику его поиска и несколько API-интерфейсов Java, которые мы можем использовать для его проверки.

    Как всегда, фрагменты кода можно найти на GitHub.

    Источник

    Поиск високосных лет на Яве

    Краткое и практическое руководство по поиску високосных лет на Java.

    1. Обзор

    В этом уроке мы продемонстрируем несколько способов определить, является ли данный год високосным годом в Java.

    Високосный год-это год, который делится на 4 и 400 без остатка . Таким образом, годы, которые делятся на 100, но не на 400, не квалифицируются, даже если они делятся на 4.

    2. Использование API календаря до Java-8

    Начиная с Java 1.1, класс GregorianCalendar позволяет нам проверять, является ли год високосным годом:

    public boolean isLeapYear(int year);

    Как и следовало ожидать, этот метод возвращает true , если данный год является високосным, и false для невисокосных лет.

    Годы в до н. э. (до Рождества Христова) должны передаваться как отрицательные значения и рассчитываться как 1 – год . Например, год 3 до н. э. представлен как -2, так как 1 – 3 = -2.

    3. Использование API даты и времени Java 8+

    Java 8 представила java . время пакет с гораздо лучшим API даты и времени .

    Класс Год в java . time пакет имеет статический метод для проверки, является ли данный год високосным:

    public static boolean isLeap(long year);

    И у него также есть метод экземпляра, чтобы сделать то же самое:

    4. Использование API Joda-Time

    API Joda-Time является одной из наиболее часто используемых сторонних библиотек среди Java-проектов для утилит даты и времени. Начиная с Java 8, эта библиотека находится в ремонтопригодном состоянии , как указано в репозитории исходных текстов Joda-Time GitHub .

    Не существует заранее определенного метода API для поиска високосного года в Joda-Time. Тем не менее, мы можем использовать их Локальную дату и Дни классы для проверки високосного года:

    LocalDate localDate = new LocalDate(2020, 1, 31); int numberOfDays = Days.daysBetween(localDate, localDate.plusYears(1)).getDays(); boolean isLeapYear = (numberOfDays > 365) ? true : false;

    5. Заключение

    В этом уроке мы рассмотрели, что такое високосный год, логику его поиска и несколько API Java, которые мы можем использовать для его проверки.

    Как всегда, фрагменты кода можно найти на GitHub.

    Читайте ещё по теме:

    Источник

Оцените статью