Calculate the date of Easter Sunday

后端 未结 6 599
半阙折子戏
半阙折子戏 2020-12-11 16:32

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

相关标签:
6条回答
  • 2020-12-11 16:40

    ...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>
    
    0 讨论(0)
  • 2020-12-11 16:42

    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.

    0 讨论(0)
  • 2020-12-11 16:49

    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);
    }
    
    0 讨论(0)
  • 2020-12-11 16:50
    /**
     * 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 );
    }
    
    0 讨论(0)
  • 2020-12-11 16:51

    You aren't far from getting your program working. You really have two things left you need to do.

    • Prompt the user for a year
    • Output the date found

    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);
    
    0 讨论(0)
  • 2020-12-11 17:01
    
    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
    
    
    0 讨论(0)
提交回复
热议问题