Solución a la Tarea 3: Triángulos isósceles

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. Sin embargo, uno puede observar que esa solución es bastante lenta. Una forma un poco más rápida se obtiene al darse cuenta que hay dos tipos de triángulos isósceles: aquellos cuyos lados iguales son menores que el tercero y aquellos cuyos lados iguales son mayores que el tercero. El programa de abajo los cuenta por separado:

#include <stdio.h>
 
int main(void)
{
  long n, m, a, b, c, t = 0;
 
  scanf("%ld%ld", &m, &n);
  for (a = m; a <= n; a++)
    for (c = a+1; c <= n; c++)
      if (2*a > c)
        t++;
  for (a = m; a <= n; a++)
    for (b = a+1; b <= n; b++)
      t++;
  printf("%ld\n", t);
  return 0;
}

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

Entrada  Salida
1 1      0
1 2      1
2 5      10
4 8      19
8 16     71
16 32    271
32 64    1055
64 128   4159
128 256  16511
256 512  65791


Para probar su tarea en UNIX, escriban la instrucción gcc trisosNN.c -o trisos para compilar su programa, y la instrucción ./trisos para correrlo. Algunos errores comúnes fueron: (a) No considerar el caso cuando m = n, (b) Olvidar que un triángulo equilátero no es isósceles, (c) Contar los triángulos por duplicado. Además, les recuerdo que sólo deben enviar el archivo .c y que éste debe tener el nombre correcto.