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.