Write a program to compute the date of Easter Sunday. Easter Sunday is the first Sunday after the first full moon of spring. Use the algorithm invented by the mathematician
...or someone needs it in ColdFusion:
<!---
Function to get the easter date adopted to ColdFusion as of
https://stackoverflow.com/questions/26022233/calculate-the-date-of-easter-sunday
--->
<cffunction name="getEasterDate">
<cfargument name="year" required="true">
<cfscript>
var currentYear = arguments["year"];
var a = floor(currentYear % 19);
var b = floor(currentYear / 100);
var c = floor(currentYear % 100);
var d = floor(b / 4);
var e = floor(b % 4);
var f = floor((b + 8) / 25);
var g = floor((b - f + 1) / 3);
var h = floor((19 * a + b - d - g + 15) % 30);
var i = floor(c / 4);
var k = floor(c % 4);
var l = floor((32 + 2 * e + 2 * i - h - k) % 7);
var m = floor((a + 11 * h + 22 * l) / 451);
var n = floor((h + l - 7 * m + 114) / 31);
var p = floor(((h + l - 7 * m + 114) % 31) + 1);
var month = n;
if (len(month) lt 2) {
month = "0" & month;
}
var day = p;
if (len(day) lt 2) {
day = "0" & day;
}
var dateString = day & '.' & month & '.' & currentYear;
return dateString;
</cfscript>
</cffunction>
Try this:
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;
}
}
An input of 2001
results in April 15
as the output.
In case anyone is looking for the updated version (NY Anonymous Gregorian) of the algorithm in Typescript...
easterDate() {
var currentYear = new Date().getFullYear();
var a = Math.floor(currentYear % 19);
var b = Math.floor(currentYear / 100);
var c = Math.floor(currentYear % 100);
var d = Math.floor(b / 4);
var e = Math.floor(b % 4);
var f = Math.floor((b + 8) / 25);
var g = Math.floor((b - f + 1) / 3);
var h = Math.floor((19 * a + b - d - g + 15) % 30);
var i = Math.floor(c / 4);
var k = Math.floor(c % 4);
var l = Math.floor((32 + 2 * e + 2 * i - h - k) % 7);
var m = Math.floor((a + 11 * h + 22 * l) / 451);
var n = Math.floor((h + l - 7 * m + 114) / 31);
var p = Math.floor(((h + l - 7 * m + 114) % 31) + 1);
// console.log('a: ' + a + ' b: ' + b + ' c: ' + c + ' d: ' + d + ' e: ' + e);
// console.log('f: ' + f + ' g: ' + g + ' h: ' + h + ' i: ' + i + ' k: ' + k);
// console.log('l: ' + l + ' m: ' + m + ' n: ' + n + ' p: ' + p);
// console.log("In the year " + currentYear + " Easter with fall on day " + p + " of month " + n);
var month = n.toString();
while (month.length < 2) month = "0" + month;
var day = p.toString();
while (day.length < 2) day = "0" + day;
var dateString = currentYear.toString() + '-' + month + '-' + day + 'T00:00:00';
return new Date(dateString);
}
/**
* Orthodox easter formula, invented back in 1800 by famous Carl Friedrich Gauss.
*/
public static LocalDate 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,
month = (h - m + r + 90) / 25,
day = (h - m + r + month + 19) % 32;
return LocalDate.of( year, month, day );
}
You aren't far from getting your program working. You really have two things left you need to do.
The trick to using a Scanner to prompt the user for input is to create a while-loop which tests each line the user enters, and keeps repeating until it sees a legal value.
Instead of hard-coding y = 2014;
(or whatever), you want to do something like this:
Scanner input = new Scanner(System.in);
int y = -1; // No easter back in B.C.
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
}
in this case, each time the user doesn't enter a number, y
remains -1
and the loop continues.
You are already doing all the calculations correctly, so to end your program, you just need to output the month/day.
I wouldn't bother trying to extract the calculation into a helper method. Just use the calculated values directly in 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);
VisualBasic Excel VBA Code
Function Easter_Sunday(Year)
k = Int(Year / 100) 'the secular number
s = 2 - Int((3 * k + 3) / 4) 'the secular sun control
m = 15 + Int((3 * k + 3) / 4) - Int((8 * k + 13) / 25) 'the secular moon circuit
a = Year Mod 19 'the lunar parameter
d = (19 * a + m) Mod 30 'the seed for the first full moon in spring
r = Int(d / 29) + (Int(d / 28) - Int(d / 29)) * Int(a / 11) 'the calendar correction amount
EB = 21 + d - r 'the Easter border
FS = 7 - (Year + Int(Year / 4) + s) Mod 7 'the first Sunday in March
ED = 7 - (EB - FS) Mod 7 'Easter distance in days
ESM = EB + ED - 1 'the date of Easter Sunday as the March date
'--------------------------------------- "For Years (1900-9999)" ------------------------------
Easter_Sunday = DateValue(1 & "." & 3 & "." & Year) + ESM
'--------------------------------------- "or for all Years" -----------------------------------
Month_ = 3 + Int(ESM / 31) 'Month March or April
ES = 1 + ESM Mod 31 'Eastersunday
Easter_Sunday = ("Su, " & Year & "." & Format(Month_, "00") & "." & Format(ES, "00"))
End Function