计算复活节星期日的日期

写一个程序来计算复活节星期日的日期。 复活节星期天是spring第一个满月后的第一个星期天。 使用数学家Carl Friedrich Gauss在1800年发明的算法:

  1. y是年份(例如1800或2001)
  2. y除以19并将余数称为a 。 忽略商。
  3. y除以100得到商b和余数c
  4. b除以4得到商d和余数e
  5. 8 * b + 13除以25得到商g 。 忽略其余部分。
  6. 19 * a + b - d - g + 15除以30得到余数h 。 忽略商。
  7. c除以4得到商j和余数k
  8. a + 11 * h除以319得到商m 。 忽略其余部分。
  9. 2 * e + 2 * j - k - h + m + 32除以7得到余数r 。 忽略商。
  10. h - m + r + 90除以25得到商n 。 忽略其余部分。
  11. h - m + r + n + 19除以32得到p的余数。 忽略商。

然后复活节落在p n个月的第p天。

例如,如果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作为产出。

你离开你的程序并不遥远。 你还有两件事需要做。

  • 提示用户一年
  • 输出找到的日期

使用Scanner提示用户输入的技巧是创建一个while循环,测试用户输入的每一行,并一直重复直到它看到合法值。

而不是硬编码y = 2014; (或其他),你想做这样的事情:

 Scanner input = new Scanner(System.in); int y = -1; // No easter back in BC while (y < 0) { System.out.println("Please enter a year (integer greater than zero)"); if (input.hasNextInt()) { // check to see if the user entered a number y = input.nextInt(); // if so, read it } input.nextLine(); // advance the scanner to the next line of input } 

在这种情况下,每次用户没有输入数字时, y保持为-1并且循环继续。

您已经正确地进行了所有计算,因此要结束您的程序,您只需要输出月/日。

我不打算尝试将计算提取到辅助方法中。 只需在main()直接使用计算值:

 int a = y % 19; int b = y / 100; ... int n = (h - m + r + 90) / 25; int p = (h - m + r + n + 19) % 32; System.out.println("In the year " + y + " Easter with fall on day " + p + " of month " + n);