Java-код для расчета високосного года - PullRequest
34 голосов
/ 20 июня 2009

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

Ответы [ 21 ]

2 голосов
/ 01 июня 2016

Вы можете задать класс GregorianCalendar для этого:

boolean isLeapyear = new GregorianCalendar().isLeapYear(year);
0 голосов
/ 23 сентября 2013

Это то, что я придумал. Существует дополнительная функция, позволяющая проверить, превышает ли 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;
}
} 
0 голосов
/ 07 декабря 2012
boolean leapYear = ( ( year % 4 ) == 0 );
0 голосов
/ 15 апреля 2013
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!"); 
    }
    }
    }
0 голосов
/ 21 января 2016

Ваш код, как он есть, без дополнительного класса, похоже, не работает для универсального 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.");
            }
        }
    }
}

Ваш код, в контексте, работает так же хорошо, но учтите, что код книги всегда работает и тщательно протестирован. Не сказать, что твое нет. :)

0 голосов
/ 24 мая 2015

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

(((year%4 == 0) && (year%100 !=0)) || (year%400==0))  

Вот пример программы Как проверить високосный год .

0 голосов
/ 31 мая 2018

С курсом: 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");
        }

    }
}
0 голосов
/ 12 ноября 2017

Самый простой способ сделать високосный год 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");
    }
}

}

0 голосов
/ 23 октября 2013
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);    



}
0 голосов
/ 10 декабря 2018

этот ответ великолепен, но он не сработает в течение многих лет до Рождества Христова (с помощью григорианского календаря с прогонками). Если вы хотите, чтобы это работало на Б.С. лет, затем используйте следующую адаптацию:

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

...