Solución a la Tarea 3: Triángulos acutángulos

Hay varias formas de resolver esta tarea. La más sencilla es tal vez anidar tres ciclos for (uno para a, otro para b y otro para c) y luego verificar que la terna producida satisface todas las condiciones necesarias, a saber, a+b>c, b+c>a, c+a>b para que sea triángulo y 0 < cos alfa < 1, 0 < cos beta < 1, 0 < cos gama < 1 para que sea acutángulo (recuerde que si un ángulo está entre 0 y 90 grados entonces su coseno está entre 0 y 1). Sin embargo, uno puede observar que esa solución es bastante lenta, además de que hay que tener cuidado con las repeticiones. Otra forma es la de continuar haciendo tres ciclos, pero cada uno comenzando donde va el otro (es decir, b comenzando con el valor de a y c comenzando con el valor de b) para de esta manera garantizar que a <= b <= c y que no hay repeticiones. Además, esto garantiza que 4 de las 6 condiciones anteriores se cumplen de forma automática, así que basta con revisar sólo dos: que a+b>c y que 0 < cos gama < 1. Para lo último, también ayuda fijarse que esta condición se cumple si y sólo si a2 + b2 > c2. Abajo muestro un programa que hace esto:

#include <stdio.h>
 
int main(void)
{
  long a, b, c, m, n, t = 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 + b > c) && (a*a + b*b > c*c))
          t++;
  printf("%ld\n", t);
  return 0;
}

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

Entrada     Salida
3 5         8
5 14        130
6 30        1189
8 28        890
9 47        4190
9 84        23311
74 93       1540
80 98       1330
90 99       220
97 219      229266

Para probar su tarea en UNIX, escriban la instrucción gcc acutanNN.c -o acutan para compilar su programa, y la instrucción ./acutan para correrlo. Algunos errores comúnes fueron: (a) Contar cada triángulo de forma repetida. (b) No revisar que los lados forman un triángulo. (c) No revisar todos los ángulos. (d) Calcular el coseno usando números enteros y por lo tanto siempre les daba 0 o -1.