计算复活节星期日的日期
写一个程序来计算复活节星期日的日期。 复活节星期天是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
个月的第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);