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