写一个程序来计算复活节星期日的日期.复活节星期日是春天第一个满月后的第一个星期天.使用数学家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
Run Code Online (Sandbox Code Playgroud)
因此,在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());
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的.我不知道如何分配东西,就像我试图得到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;
}
}
Run Code Online (Sandbox Code Playgroud)
2001结果输入April 15作为输出.