Проблемы с кодом Java високосного года

import java.util.Scanner;

public class Hw2JamesVaughn  {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);        
        System.out.print("Enter a year: ");
        int year = input.nextInt();
        if((year < 1582) == (year % 4==0))
            System.out.println(year + " is a leap year");
        else
            System.out.println(year + " is not a leap year");

        if((year > 1582) == (year % 100 != 0) || (year % 400 == 0))
            System.out.println(year + " is a leap year");
        else
            System.out.println(year + " is not a leap year");

    }                
}

Это задание.

(Чтобы определить, является ли конкретный год високосным, используйте следующую логику:

  • год должен делиться на 4
  • начиная с 1582 года, если год делится на 100, он также должен делиться на 400. Таким образом, 1700 год не високосный, а 2000 год. Однако 1500 - это високосный год, поскольку это было до 1582 года, года принятия григорианского календаря. Ваша программа запросит год, а затем покажет, является ли год високосным или нет.)

Я зашел так далеко с моей программой високосного года Java, но она не работает! Я работал над этим и понятия не имел, что не так.


person Rick Vaughn    schedule 01.09.2014    source источник
comment
Подумайте об этом условии: (year < 1582) == (year % 4==0). Очень подумайте о том, что это проверяет. Я не думаю, что это то, что вы имеете в виду. (Подсказка: я бы просто отделил все до 1582 года от всего, начиная с 1582 года, и проигнорировал бы тот факт, что эти две ветви будут иметь что-то общее ...)   -  person Jon Skeet    schedule 02.09.2014
comment
В вашем коде есть синтаксическая ошибка - ; сразу после оператора if, который завершает блок if без тела. Следующие else остаются без соответствующих if.   -  person papacito    schedule 02.09.2014
comment
Я думаю, что год разделения - 1752, а не 1582 ... вы можете это проверить ?? если у вас linux, проверьте cal 1700 :)) для windows не могу посоветовать, у меня его нет ..   -  person mlwn    schedule 02.09.2014
comment
Можете ли вы просто использовать стандартные библиотеки Java, подобные этой docs.oracle.com/javase/7/docs/api/java/util/?   -  person mvp    schedule 02.09.2014
comment
@mvp - Да, см. ответ от Садасидхи ниже   -  person marklark    schedule 31.03.2016


Ответы (2)


Во-первых, это if((year < 1582) == (year % 4==0)) проверяет логическое равенство. Я думаю, вы хотели if((year < 1582) && (year % 4==0)), но боюсь, это все еще не исправляет вашу логику.

Предлагаю начать с создания метода. Первая часть должна проверить, меньше ли year 1582. Если да, верните истину, если оно кратно 4. Вторая часть хорошо описана на Википедия здесь. Если сложить это вместе, получится что-то вроде:

private static boolean isLeapYear(int year) {
    if (year < 1582) {
        return (year % 4 == 0);
    }
    /*
     * Rest of algorithm from: http://en.wikipedia.org/wiki/Leap_year
     */
    if (year % 4 != 0) {
        /*
         * if (year is not divisible by 4) then (it is a common year)
         */
        return false;
    } else if (year % 100 != 0) {
        /*
         * else if (year is not divisible by 100) then (it is a leap year)
         */
        return true;
    }
    /*
     * else if (year is not divisible by 400) then (it is a common year)
     * else (it is a leap year)
     */
    return (year % 400 == 0);
}

Затем вы можете использовать _ 5_, чтобы вывести результат,

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print("Enter a year: ");
    int year = input.nextInt();
    System.out.printf("%d %s leap year", year, isLeapYear(year) ? "is a"
            : "is not a");
}

Наконец, ваш исходный код может быть реализован как -

if (year < 1582 && year % 4 == 0)
    System.out.println(year + " is a leap year");
else if (year < 1582)
    System.out.println(year + " is not a leap year");
else if (year >= 1582 && (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");
person Elliott Frisch    schedule 01.09.2014

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

static boolean isLeapYear(int year){
    Calendar calendar= Calendar.getInstance();
    calendar.set(Calendar.YEAR,year);
    return calendar.getActualMaximum(Calendar.DAY_OF_YEAR) > 365;
}
person mirmdasif    schedule 02.09.2014