【问题标题】:Java Program for Leap Years in a Range闰年的 Java 程序
【发布时间】:2021-01-02 19:52:51
【问题描述】:

我似乎无法弄清楚为什么它不会在一个范围内打印超过一年。到目前为止,除此之外的一切我都已准备就绪。

开始年份不能早于 1752 年,结束年份不能早于 9999。我需要程序找到所选开始年份和所选结束年份之间的所有闰年,然后打印所有这些闰年为用户。

在我在末尾添加else if 以在给定范围内没有年份时打印一条消息之前,一切似乎都运行良好。如果可以的话,我会删除它,但该消息是我的作业要求的一部分。

import java.util.Scanner;
class Final_Project_Mendenhall {
  public static void main(String[] args)
    {
        int startYear = 1752;
        int endYear = 9999;
        int i;
        int j = 0;
 
        Scanner in = new Scanner(System.in); //Scanner object to get user input for Start Year
        System.out.print("Enter the Start Year (Greater or equal to 1752):");
        startYear = in.nextInt(); //Get Start Year from user
            while (startYear < 1752){
            System.out.println("Enter a valid start year (Greater or equal to 1752):");
            startYear = in.nextInt(); //Get valid Start Year from user
        } //End while
        
        System.out.print("Enter the End Year (Less than 9999):");
        endYear = in.nextInt(); //Get End Year from user
            while (endYear > 9999){
            System.out.println("Enter a valid end year (Less than 9999):");
            endYear = in.nextInt(); //Get valid End Year from user
        } //End while
       
        System.out.println("Leap years:"); //Print Leap Years
 
        for (i = startYear; i <= endYear; i++){ //Loop through years between Start and End Years
          if ((0 == i % 4) && (0 == i % 400)){ //Find and print Leap Years, if there are
            System.out.println(i);
            j++;
          }//End if
        //End for
         else if(j == 0){
            System.out.println("There are no leap years in that range");
        }//End if
      }
      }
    }

【问题讨论】:

  • 最后的 if 语句应该在 for 循环之后,并且不应该有 else-if。

标签: java leap-year


【解决方案1】:

您需要修复的特定代码行似乎是这样的:

if ((0 == i % 4) && (0 == i % 400))

如果我们对此进行分析,您可以看到,只有i 能被 400 整除,this 才会返回 true。如果你把它改成这样:

if ((0 == i % 4 && 0 != i % 100) || (0 == i % 400))

你应该会看到它起作用了。清理我们得到的代码:

import java.util.Scanner;
class Final_Project_Mendenhall {
  public static void main(String[] args)
    {
        int startYear = 1752;
        int endYear = 9999;
        int i;
        int j = 0;
 
        Scanner in = new Scanner(System.in);
        System.out.print("Enter the Start Year (Greater or equal to 1752):");
        startYear = in.nextInt(); //Get Start Year from user
        while (startYear < 1752){
            System.out.println("Enter a valid start year (Greater or equal to 1752):");
            startYear = in.nextInt(); //Get valid Start Year from user
        }
        
        System.out.print("Enter the End Year (Less than 9999):");
        endYear = in.nextInt(); //Get End Year from user
        while (endYear > 9999){
            System.out.println("Enter a valid end year (Less than 9999):");
            endYear = in.nextInt(); //Get valid End Year from user
        } //End while
       
        System.out.println("Leap years:"); //Print Leap Years
 
        for (i = startYear; i <= endYear; i++){
          if ((0 == i % 4 && 0 != i % 100) || (0 == i % 400)){
            System.out.println(i);
            j++;
          }
        }
        if(j == 0){
            System.out.println("There are no leap years in that range");
        }
    }
}

【讨论】:

    【解决方案2】:
    if ((0 == i % 4) && (0 == i % 400))
    

    同时搜索可被 4 和 400 整除的 is,实际上是 400。
    您可能想要检查的是 is 可被 4 整除,但不能被 100 整除,除非它们能被 400 整除。一种写法是

    if (((0 == i % 4) && (0 != i % 100)) || (0 == i % 400))
    

    并且那个 no-leap-year-found 消息应该在循环之后,而不是在 else if 中。只有在检查整个范围后才能发现什么都没有找到:

    for (i = startYear; i <= endYear; i++){ //Loop through years between Start and End Years
      if (((0 == i % 4) && (0 != i % 100)) || (0 == i % 400) { //Find and print Leap Years, if there are
        System.out.println(i);
        j++;
      } //End if
    } //End for <--- the } was missing
    if(j == 0) { // <--- no else
      System.out.println("There are no leap years in that range");
    }
        
    

    【讨论】:

      【解决方案3】:

      您的闰年条件不正确。

      以下是一年有资格成为闰年的条件:

      1. 可以被 400 整除-或-
      2. 能被 4 整除,但不能被 100 整除

      替换

      if ((0 == i % 4) && (0 == i % 400))
      

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

      对于生产代码,我还建议您使用 OOTB java.time API:

      for (i = startYear; i <= endYear; i++) {
          if (java.time.Year.isLeap(i)) {
              System.out.println(i);
          }
      }
      

      能被四整除的每一年都是闰年,除了 对于可以被 100 整除的年份,但这些百年 如果它们能被 400 整除,则它们是闰年。例如, 1700、1800 和 1900 年不是闰年,而是 1600 年和 2000 是。[2]

      — 美国海军天文台

      来源:https://en.wikipedia.org/wiki/Gregorian_calendar

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-31
        • 2017-06-14
        相关资源
        最近更新 更多