Java闰年代码问题

7
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闰年程序走到了这一步,但它并没有起作用!我一直在努力解决这个问题,但我不知道哪里出了错。


6
想一想这个条件语句:(year < 1582) == (year % 4==0)。非常仔细地考虑它检查的内容。我认为它并不是你想表达的意思。(提示:我只是把“1582年之前的所有东西”与“1582年以后的所有东西”分开,忽略了这两个分支将有任何共同点的事实...) - Jon Skeet
你的代码存在语法错误 - 在 if 语句后面有一个分号 ;,导致 if 块没有主体而结束。接下来的 else 没有对应的 if - papacito
我认为分裂的年份是1752年,而不是1582年...你能检查一下吗?如果你在Linux下,请检查cal 1700 :)) 我无法为Windows提供建议,因为我没有它。 - mlwn
你可以简单地使用Java标准库,就像这个链接中的http://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html#isLeapYear(int)一样吗? - mvp
@mvp - 是的,请参见下面sadasidha的答案。 - marklark
在Java 8及更高版本中:java.time.Year.of(2017).isLeap() - Basil Bourque
2个回答

1
首先,这个if((year < 1582) == (year % 4==0))检查布尔相等性。我认为你想要一个if((year < 1582) && (year % 4==0)),但恐怕这仍然无法修复你的逻辑。
我建议你先创建一个方法。第一部分应该测试year是否小于1582。如果是,则返回 true 如果它是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);
}

然后您可以使用 printf 来输出结果,

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

0
除了算法之外,您还可以使用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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接