home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / EASTER.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  1KB  |  67 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*
  4. **  EASTER.C - Determine the date of Easter for any given year
  5. **
  6. **  public domain by Ed Bernal
  7. */
  8.  
  9. #include <stdlib.h>
  10. #include "datetime.h"
  11.  
  12.  
  13. void easter(int year,int *easter_month, int *easter_day)
  14. {
  15.       int a,b,c,e,g,h,i,k,u,x,z;
  16.       div_t f;
  17.  
  18.       /*
  19.       **  Gauss' famous algorithm (I don't know how or why it works,
  20.       **  so there's no commenting)
  21.       */
  22.  
  23.       a = year % 19;
  24.       f = div(year,100);
  25.       b = f.quot;
  26.       c = f.rem;
  27.       f = div(b,4);
  28.       z = f.quot;
  29.       e = f.rem;
  30.       f = div((8*b + 13),25);
  31.       g = f.quot;
  32.       f = div((19*a + b - z - g + 15),30);
  33.       h = f.rem;
  34.       f = div((a + 11*h),319);
  35.       u = f.quot;
  36.       f = div(c,4);
  37.       i = f.quot;
  38.       k = f.rem;
  39.       f = div((2*e + 2*i - k - h + u + 32),7);
  40.       x = f.rem;
  41.       f = div((h-u+x+90),25);
  42.       *easter_month = f.quot;
  43.       f = div((h-u+x + *easter_month +19),32);
  44.       *easter_day = f.rem;
  45. }
  46.  
  47. #ifdef TEST
  48.  
  49. #include <stdio.h>
  50.  
  51. main(int argc, char *argv[])
  52. {
  53.       int yr, mo, dy;
  54.  
  55.       while (--argc)
  56.       {
  57.             yr = atoi(*++argv);
  58.             if (100 > yr)
  59.                   yr += 1900;
  60.             easter(yr, &mo, &dy);
  61.             printf("Easter in %d on %d/%d\n", yr, mo, dy);
  62.       }
  63.       return 0;
  64. }
  65.  
  66. #endif /* TEST */
  67.