/*
   Autor: Sebastian Iwanowski
   Erstellungsdatum: März 2004
   Zielgruppe: Schüler im Leistungskurs Informatik, Klasse 11
   Kenntnisse der Schüler: Verzweigungen, einfache Schleifen,
                           noch keine Methoden, kein OOP
   Aufgabenstellung: Gib ein Datum ein und berechne, wann im Zeitraum zwischen
                     1583 und 2299 dieses Datum auf einen beweglichen
                     Feiertag der Osterzeit fällt.
*/

import java.io.*;

public class OsternDatumsanfrage {

  public static void main (String args[]) throws IOException
  {
    /* Methode:
    
       Es werden nach dem Algorithmus von Gauß zu einem gegebenen Datum
       (tag, monat) alle Jahre zwischen 1583 und 2299 ausgerechnet,
       in dem das Datum auf einen beweglichen Feiertag der Osterzeit fällt:
       
       Es werden für jedes Jahr die Feiertage Rosenmontag, Fasching (Fastnacht),
       Aschermittwoch, Karfreitag, Ostern (Ostersonntag), Ostermontag,
       Himmelfahrt, Pfingsten (Pfingstsonntag), Pfingstmontag und Fronleichnam
       berechnet und mit dem gegebenen Datum verglichen.
    */
  
    // Verbindung mit der Eingabekonsole:
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    
    // Deklaration der Variablen:
    int tag, monat; // Eingabedaten
    int jahr; // Laufvariable für getesteten Jahresbereich
    int rosenmontag, fasching, aschermittwoch, karfreitag, ostertag, ostermontag,
        himmelfahrt, pfingsttag, pfingstmontag, fronleichnam;
        //Tage der berechneten Feiertagsdaten
    int rosenmonat, faschingsmonat, aschermonat, karmonat, ostermonat,
        ostermmonat, himmelmonat, pfingstmonat, pfingstmmonat, fronmonat;
        //Monate der berechneten Feiertagsdaten
    String feiertagsname; // für die Ausgabe
    boolean keinFeiertag = true; // für die Ausgabe
    int m, n, a, b, c, d, e; // interne Größen für den Gauß-Algorithmus
    boolean schaltjahr; // gibt an, ob betreffendes Jahr Schaltjahr ist
    
    // INPUT:
    
    System.out.print ("Tag eingeben (Zahl): ");
    tag = Integer.parseInt (in.readLine());
    System.out.print ("Monat eingeben (Zahl): ");
    monat = Integer.parseInt (in.readLine());

    // OUTPUT:
    
    System.out.println ("Bewegliche Feiertage der Osterzeit in den folgenden Jahren:");
    
    // BERECHNUNG (Kernalgorithmus):
    
    for (jahr = 1583; jahr <= 2299; jahr++)
    { // Schleife über alle Jahre im zulässigen Bereich des Gauß-Algorithmus
    
      schaltjahr = (((jahr%4) == 0) && ((jahr%100) != 0)) || (jahr%400 == 0);
      
      // Berechnung der internen Größen m und n:
      if (jahr<1700)
      {
        m=22; n=2;
      }
      else if (jahr < 1800)
      {
        m=23; n=3;
      }
      else if (jahr < 1900)
      {
        m=23; n=4;
      }
      else if (jahr < 2100)
      {
        m=24; n=5;
      }
      else if (jahr < 2200)
      {
        m=24; n=6;
      }
      else
      {
        m=25; n=0;
      }

      // Berechnung der internen Größen a,b,c,d,e:
      a = jahr % 19;
      b = jahr % 4;
      c = jahr % 7;
      d = (19*a+m) % 30;
      e = (2*b+4*c+6*d+n) % 7;

      // Berechnung der Feiertage:
      ostertag = (22+d+e); // gilt nur für ostermonat == 3
      
      if (ostertag > 31)
      { // ostermonat == 4
      
        // Berechnung von Ostern:
        ostermonat = 4;
        ostertag = (d+e-9); // Korrektur für April
        if (ostertag == 26)
          ostertag = 19;
        else if ((ostertag == 25) && (d==28) && (e==6) && (a>10))
          ostertag = 18;

        // Berechnung von Pfingsten (7 Wochen nach Ostern):
        pfingsttag = ostertag + 19; // 49 Tage danach minus 30 Apriltage
        if (pfingsttag > 31)
        {
          pfingsttag = pfingsttag - 31;
          pfingstmonat = 6;
        }
        else
          pfingstmonat = 5;

        // Berechnung von Karfreitag (2 Tage vor Ostern):
        karfreitag = ostertag - 2;
        if (karfreitag < 1)
        {
          karfreitag = karfreitag + 31;
          karmonat = 3;
        }
        else
          karmonat = 4;

        // Berechnung von Ostermontag (1 Tag nach Ostern):
        ostermontag = ostertag + 1;
        ostermmonat = 4;

        // Berechnung von Himmelfahrt (39 Tage nach Ostern):
        himmelfahrt = ostertag + 9; // 39 Tage danach minus 30 Apriltage
        if (himmelfahrt > 31)
        {
          himmelfahrt = himmelfahrt - 31;
          himmelmonat = 6;
        }
        else
          himmelmonat = 5;

        // Berechnung von Pfingstmontag (1 Tag nach Pfingsten):
        pfingstmontag = pfingsttag + 1;
        if (pfingstmontag == 32)
        {
          pfingstmontag = 1;
          pfingstmmonat = 6;
        }
        else
          pfingstmmonat = pfingstmonat;

        // Berechnung von Fronleichnam (11 Tage nach Pfingsten):
        fronleichnam = ostertag - 1; // 60 Tage nach Ostern minus 30 Apriltage
                                     // minus 31 Maitage
        if (fronleichnam == 0)
        {
          fronleichnam = 31;
          fronmonat = 5;
        }
        else
          fronmonat = 6;

        // Berechnung von Aschermittwoch (46 Tage vor Ostern):
        if (ostertag >= 16)
        {
          aschermittwoch = ostertag - 15; // 46 Tage davor plus 31 Märztage
          aschermonat = 3;
        }
        else
        {
          aschermonat = 2;
          if (schaltjahr)
            aschermittwoch = ostertag + 14; // 46 Tage davor plus 31 Märztage
                                            // plus 29 Februartage
          else
            aschermittwoch = ostertag + 13; // 46 Tage davor plus 31 Märztage
                                            // plus 28 Februartage
        }

      } // ostermonat == 4
      else
      { // ostermonat == 3
      
        ostermonat = 3;
        
        // Berechnung von Pfingsten (7 Wochen nach Ostern):
        pfingsttag = ostertag - 12; // 49 Tage danach minus 31 Märztage
                                    // minus 30 Apriltage
        pfingstmonat = 5;
        
        // Berechnung von Karfreitag (2 Tage vor Ostern):
        karfreitag = ostertag - 2;
        karmonat = 3;
        
        // Berechnung von Ostermontag (1 Tag nach Ostern):
        ostermontag = ostertag + 1;
        if (ostermontag == 32)
        {
          ostermontag = 1;
          ostermmonat = 4;
        }
        else
          ostermmonat = 3;

        // Berechnung von Himmelfahrt (39 Tage nach Ostern):
        himmelfahrt = ostertag - 22; // 39 Tage danach minus 31 Märztage
                                     // minus 30 Apriltage
        if (himmelfahrt == 0)
        {
          himmelfahrt = 30;
          himmelmonat = 4;
        }
        else
          himmelmonat = 5;

        // Berechnung von Pfingstmontag (1 Tag nach Pfingsten):
        pfingstmontag = pfingsttag + 1;
        pfingstmmonat = 5;
        
        // Berechnung von Fronleichnam (11 Tage nach Pfingsten):
        fronleichnam = ostertag - 1; // 60 Tage nach Ostern minus 31 Märztage
                                     // minus 30 Apriltage
        fronmonat = 5;
        
        // Berechnung von Aschermittwoch (46 Tage vor Ostern):
        aschermonat = 2;
        if (schaltjahr)
          aschermittwoch = ostertag - 17; // 46 Tage davor plus 29 Februartage
        else
          aschermittwoch = ostertag - 18; // 46 Tage davor plus 28 Februartage
          
      } // ostermonat == 3
      
      // Berechnung von Fasching (1 Tag vor Aschermittwoch):
      if (aschermittwoch != 1)
      { // Aschermittwoch != 1. März
        faschingsmonat = aschermonat;
        fasching = aschermittwoch - 1;
      }
      else
      { // Aschermittwoch == 1. März
        faschingsmonat = 2;
        if (schaltjahr)
          fasching = 29;
        else
          fasching = 28;
      }

      // Berechnung von Rosenmontag (1 Tag vor Fasching):
      if (fasching != 1)
      { // Fasching != 1. März
        rosenmonat = faschingsmonat;
        rosenmontag = fasching - 1;
      }
      else
      { // Fasching == 1. März
        rosenmonat = 2;
        if (schaltjahr)
          rosenmontag = 29;
        else
          rosenmontag = 28;
      }
      
      // Hiemit sind alle Feiertage berechnet
      
      // Vergleich der Feiertage mit dem Eingabedatum:
      if ((karfreitag == tag) && (karmonat == monat))
        feiertagsname = "Karfreitag";
      else if ((ostertag == tag) && (ostermonat == monat))
        feiertagsname = "Ostern";
      else if ((ostermontag == tag) && (ostermmonat == monat))
        feiertagsname = "Ostermontag";
      else if ((himmelfahrt == tag) && (himmelmonat == monat))
        feiertagsname = "Himmelfahrt";
      else if ((pfingsttag == tag) && (pfingstmonat == monat))
        feiertagsname = "Pfingsten";
      else if ((pfingstmontag == tag) && (pfingstmmonat == monat))
        feiertagsname = "Pfingstmontag";
      else if ((fronleichnam == tag) && (fronmonat == monat))
        feiertagsname = "Fronleichnam";
      else if ((aschermittwoch == tag) && (aschermonat == monat))
        feiertagsname = "Aschermittwoch";
      else if ((fasching == tag) && (faschingsmonat == monat))
        feiertagsname = "Fasching";
      else if ((rosenmontag == tag) && (rosenmonat == monat))
        feiertagsname = "Rosenmontag";
      else
        feiertagsname = "";
        
      // OUTPUT:
      if (feiertagsname != "")
      {
        keinFeiertag = false;
        System.out.println (jahr + ": " + feiertagsname);
      }
        
    } // Schleife über alle Jahre im zulässigen Bereich des Gauß-Algorithmus
    
    // OUTPUT:
    if (keinFeiertag)
      System.out.println ("Dieser Tag ist in keinem Jahr zwischen 1583 und 2299 ein Feiertag der Osterzeit.");
  }

}