编写一个程序来计算复活节星期天的日期。复活节星期日是 Spring 的第一个满月之后的第一个星期日。
使用数学家卡尔·弗里德里希·高斯(Carl Friedrich Gauss)在1800年发明的算法:

  • y为年份(例如1800或2001)
  • y除以19并调用其余的a。忽略商。
  • y除以100以获得商b和余数c
  • b除以4以获得商d和余数e
  • 8 * b + 13除以25以获得商g。忽略其余部分。
  • 19 * a + b - d - g + 15除以30以获得剩余的h。忽略
    商。
  • c除以4以获得商j和余数k
  • a + 11 * h除以319以获得商m。忽略其余部分。
  • 2 * e + 2 * j - k - h + m + 32除以7以得到剩余的r。忽略商。
  • h - m + r + 90除以25以获得商n。忽略
    余。
  • h - m + r + n + 19除以32以得到剩余p。忽略
    商。

  • 然后,复活节落在月份p的一天n上。

    例如,如果y为2001:

    a = 6
    b = 20
    c = 1
    d = 5
    e = 0
    g = 6
    h = 18
    j = 0
    k = 1
    m = 0
    r = 6
    n = 4
    p = 15
    

    因此,在2001年,复活节星期日是4月15日。

    确保提示用户输入年份并让用户输入年份。另外,请确保输出p和n的值以及描述输出值的适当消息。

    我在将其放入Java代码时遇到了一些麻烦。这是我尝试过的:
    import java.util.Scanner;
    
    
    
    public class Easter {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
    
            int y = 2014;
            int a = y % 19;
            int b = y / 100;
            int c = y % 100;
            int d = b / 4;
            int e = b % 4;
            int g = (8 * b + 13) / 25;
            int h = (19 * a + b - d - g + 15) % 30;
            int j = c / 4;
            int k = c % 4;
            int m = (a + 11 * h) / 319;
            int r = (2 * e + 2 * j - k - h + m + 32) % 7;
            int n = (h - m + r + 90) / 25;
            int p = (h - m + r + n + 19) % 32;
    
            getEasterSundayMonth = n;
            System.out.println("Month: " + Easter.getEasterSundayMonth());
        }
    }
    

    这就是我所拥有的。我不知道如何分配内容,就像我试图使getEasterSundayMonth等于n的值一样,很确定它是不正确的。我从这里去哪里?

    最佳答案

    试试这个:

    import java.util.Scanner;
    
    class Easter
    {
        public static void main(String[] args)
        {
            System.out.print("Please enter a year to calculate Easter Sunday\n>");
            Scanner s = new Scanner(System.in);
            int inputted = getResult(s);
            while(inputted <= 0)
            {
                System.out.print("Expected a positive year. Please try again:\n>");
                inputted = getResult(s);
            }
            System.out.println(getEasterSundayDate(inputted));
        }
    
        private static int getResult(Scanner s)
        {
            while(!s.hasNextInt())
            {
                System.out.print("Expected a valid year. Please try again:\n>");
                s.nextLine();
            }
            return s.nextInt();
        }
    
        public static String getEasterSundayDate(int year)
        {
            int a = year % 19,
                b = year / 100,
                c = year % 100,
                d = b / 4,
                e = b % 4,
                g = (8 * b + 13) / 25,
                h = (19 * a + b - d - g + 15) % 30,
                j = c / 4,
                k = c % 4,
                m = (a + 11 * h) / 319,
                r = (2 * e + 2 * j - k - h + m + 32) % 7,
                n = (h - m + r + 90) / 25,
                p = (h - m + r + n + 19) % 32;
    
            String result;
            switch(n)
            {
                case 1:
                    result = "January ";
                    break;
                case 2:
                    result = "February ";
                    break;
                case 3:
                    result = "March ";
                    break;
                case 4:
                    result = "April ";
                    break;
                case 5:
                    result = "May ";
                    break;
                case 6:
                    result = "June ";
                    break;
                case 7:
                    result = "July ";
                    break;
                case 8:
                    result = "August ";
                    break;
                case 9:
                    result = "September ";
                    break;
                case 10:
                    result = "October ";
                    break;
                case 11:
                    result = "November ";
                    break;
                case 12:
                    result = "December ";
                    break;
                default:
                    result = "error";
            }
    
            return result + p;
        }
    }
    
    2001的输入导致April 15作为输出。

    10-06 01:46