【问题标题】:Java leap year code problemsJava闰年代码问题
【发布时间】:2014-10-26 02:35:42
【问题描述】:
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 闰年计划已经做到了这一点,但它不起作用!我一直在努力,但我不知道出了什么问题。

【问题讨论】:

  • 想想这个条件:(year &lt; 1582) == (year % 4==0)非常仔细考虑检查的内容。我不认为这是你的意思。 (提示:我只是将“1582 年之前的所有内容”与“1582 年以后的所有内容”分开,并忽略这两个分支有任何共同点的事实......)
  • 您的代码中存在语法错误 - ; 紧跟在 if 语句之后,它完成了没有正文的 if 块。以下else 没有任何对应的if
  • 我认为分裂的年份是 1752 年,而不是 1582 年......你能检查一下吗?如果您在 linux 下,请检查 cal 1700 :)) 我无法为 windows 提供建议,因为我没有它..
  • 你能像docs.oracle.com/javase/7/docs/api/java/util/…这样简单地使用Java标准库吗?
  • @mvp - 是的,请参阅以下来自 sadasidha 的答案

标签: java jgrasp leap-year


【解决方案1】:

首先,这个if((year &lt; 1582) == (year % 4==0)) 检查布尔相等。我想你想要一个if((year &lt; 1582) &amp;&amp; (year % 4==0)),但恐怕这仍然不能解决你的逻辑。

我建议你从创建一个方法开始。第一部分应该测试year 是否小于 1582。如果是,如果它是 4 的倍数,则返回 true。第二部分在 Wikipedia here 中有很好的描述。把它放在一起会得到类似的东西,

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-11
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多