Solución a la Tarea 2: El Problema de Pitágoras

A continuación muestro dos programas que resuelven el problema propuesto. El primero de ellos consiste de tres ciclos anidados. Observe que la forma en la que están definidos los ciclos garantizan que m <= a <= b <= c <= n. Sin embargo, este programa tiene la desventaja de que es muy lento.

#include <stdio.h>

int main(void)
{
  long int a, b, c, m, n, p;

  p = 0;
  scanf("%ld%ld", &m, &n);
  for (a = m; a <= n; a++)
    for (b = a; b <= n; b++)
      for (c = b; c <= n; c++)
        if (a*a + b*b == c*c)
          p++;
  printf("%ld\n", p);
  return 1;
}

El segundo programa que muestro evita recorrer todos los valores de c para verificar si alguno forma una terna con los valores de a y b. Este programa también evita revisar valores de b que garantizan que c será mayor que n. Observe que esta vez tenemos que revisar explícitamente que c es igual o menor que n.

#include <stdio.h>

int main(void)
{
  long int a, b, c, m, n, p;

  p = 0;
  scanf("%ld%ld", &m, &n);
  for (a = m; a <= n; a++)
    for (c = b = a; (b <= n) && (c <= n); b++) {
      while (a*a + b*b > c*c)
        c++;
      if ((a*a + b*b == c*c) && (c <= n))
        p++;
    }
  printf("%ld\n", p);
  return 1;
}

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

    Entrada  Salida
        1 1  0
        3 5  1
       5 10  1
       6 20  4
      10 20  1
      10 30  5
      12 80  30
     15 100  39
     24 320  194
    48 1280  1090
     50 100  6
    100 200  12
    100 300  63
   500 1000  74
  1000 2000  158