Подтвердить что ты не робот

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:: Оба вышеуказанного кода работают нормально, я хочу спросить, какой код является лучшим способом для вычисления високосного года.

4b9b3361

Ответ 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!");
            }

        }
    }
}

Ответ 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!"); 
    }
    }
    }