Solución a la Tarea 2: Un algoritmo de Gauss poco conocido

Esta tarea se trataba de simplemente implementar el algoritmo descrito, lo cual no representaba mayor dificultad excepto por la codificación en C de los pasos 7 a 9 y la escritura como algoritmo (y después codificación en C) de las instrucciones para calcular el día y el mes a partir del valor de la variable J. En el programa que muestro abajo simplemente reescribo el paso 7 para preguntar cuándo sí hago el paso 8 (pero hay muchas otras formas de hacerlo).

#include <stdio.h>

int main(void)
{
  int a, b, c, d, e, f, g, h, i, j, m;

  scanf("%d", &a);
  b = a/100 + 1;
  c = 3*b/4 - 12;
  e = (a%19) + 1;
  f = (8*b+5)/25 - (5+c);
  g = 5*a/4 - (c+10);
  h = (11*e+20+f) % 30;
  if (h == 25)
    if (e > 11)
      h = h + 1;
  if (h == 24)
    h = h + 1;
  i = 44 - h;
  if (i < 21)
    i = i + 30;
  j = i + 7 - ((g+i)%7);
  if (j <= 31) {
    d = j;
    m = 3;
  } else {
    d = j - 31;
    m = 4;
  }
  printf("%d %d\n", d, m);
  return 0;
}

Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

Entrada   Salida
1583      10 4
1810      22 4
1972      2 4
2000      23 4
2005      27 3
2006      16 4
3333      29 3
4567      12 4
9876      9 4
9999      28 3

Para probar su tarea en UNIX, escriban la instrucción gcc pascuaNN.c -o pascua para compilar su programa, y la instrucción ./pascua para correrlo. Algunos errores comúnes fueron: (a) Hacer los cálculos con flotantes en lugar de con enteros. (b) Utilizar las divisiones 3/4 y 5/4 que en C tienen los valores 0 y 1, y no los valores 0.75 y 1.25 como podría esperarse. (c) No poner los paréntesis al calcular módulos. (d) No cambiar el valor de M de acuerdo con el valor de J.