Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Ternas Pitagóricas, no logro hacerlo

Estas en el tema de Ternas Pitagóricas, no logro hacerlo en el foro de C/C++ en Foros del Web. Código: //Declaración de variable int liN, liContador1, liContador2, liContador3, liContadora = 0; //Entrada de datos printf("Ingrese un valor: "); scanf("%d", &liN); //Procesamiento for (liContador1 = ...
  #1 (permalink)  
Antiguo 27/03/2015, 14:17
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Pregunta Ternas Pitagóricas, no logro hacerlo

Código:
    //Declaración de variable
    int liN, liContador1, liContador2, liContador3, liContadora = 0;

    //Entrada de datos
    printf("Ingrese un valor: ");
    scanf("%d", &liN);

    //Procesamiento
    for (liContador1 = 1; liContador1 <= liN; liContador1++)
    {
        for (liContador2 = 1; liContador2 <= liN; liContador2++)
        {
            for (liContador3 = 1; liContador3 <= liN; liContador3++)
            {
                if (pow(liContador1,2) + pow(liContador2,2) == pow(liContador3,2))
                    printf("(%d, %d, %d)\n", liContador1, liContador2, liContador3);
            }
        }
    }
Hola,
Hasta ahora llevo esto, en el IF tengo las condiciones que necesitan los números para ser una Terna Pitagórica.

El problema es que no sé si esta bien y no sé que debo modificar, estoy confundido.
Cuando ingreso N = 100, los valores resultantes son incorrectos.

:(
  #2 (permalink)  
Antiguo 27/03/2015, 16:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Ternas Pitagóricas, no logro hacerlo

¿Como sabes que son incorrectos?
Yo no encontré ningún valor incorrecto.
  #3 (permalink)  
Antiguo 27/03/2015, 16:05
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: Ternas Pitagóricas, no logro hacerlo

mmmmmmmm

¿No te es más sencillo aplicar una fórmula?:

Cita:
Es fácil demostrarlo usando la primera terna pitagórica (3, 4 y 5):

Sea n un entero mayor que 1: 3n, 4n y 5n también son una terna pitagórica. Esto es verdad porque:

(3n)2 + (4n)2 = (5n)2
Cita:
Construir ternas pitagóricas
Es fácil construir ternas pitagóricas. Si m y n son números naturales,
Sean a = n2 - m2, b = 2nm, c = n2 + m2. Entonces, a, b y c son una terna pitagórica.

Por ejemplo, sean m=1 y n=2.
a = 22-12 = 4-1 = 3
b = 2 × 2 × 1 = 4
c = 22+12 = 5
Y así obtenemos la primera terna pitagórica (3,4,5).

De la misma manera, si m=2 y n=3 obtenemos la siguiente terna (5,12,13)
.

Supongo el ejercicio es para desarrollar lógica, por eso no conviene ponerte el código, haz pruebas de escritorio y trata de programarlo.

Saludos

http://www.disfrutalasmatematicas.co...as-ternas.html
  #4 (permalink)  
Antiguo 27/03/2015, 16:12
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: Ternas Pitagóricas, no logro hacerlo

Cita:
Iniciado por Myakire Ver Mensaje
mmmmmmmm

¿No te es más sencillo aplicar una fórmula?:



.

Supongo el ejercicio es para desarrollar lógica, por eso no conviene ponerte el código, haz pruebas de escritorio y trata de programarlo.

Saludos

http://www.disfrutalasmatematicas.co...as-ternas.html
Hola, de esa misma pagina fue que me guié.

Lo que pasa es que me salen valores que en otros ejemplos de ejercicios hechos no los veo

:(
  #5 (permalink)  
Antiguo 27/03/2015, 16:32
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Ternas Pitagóricas, no logro hacerlo

Cita:
Iniciado por RGT Ver Mensaje
Hola, de esa misma pagina fue que me guié.

Lo que pasa es que me salen valores que en otros ejemplos de ejercicios hechos no los veo

:(
Puedes poner un ejemplo?
  #6 (permalink)  
Antiguo 28/03/2015, 13:42
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: Ternas Pitagóricas, no logro hacerlo

Cita:
Iniciado por razpeitia Ver Mensaje
Puedes poner un ejemplo?
Hola, gracias por responder.
Aquí el ejemplo de los resultados que tengo con este código:

Código:
//Declaración de variable
    int liN, liContador1, liContador2, liContador3, liContadora = 0;
 
    //Entrada de datos
    printf("Ingrese un valor: ");
    scanf("%d", &liN);
 
    //Procesamiento
    printf("\n");
 
    for (liContador1 = 1; liContador1 <= liN; liContador1++)
    {
        for (liContador2 = 1; liContador2 <= liN; liContador2++)
        {
            for (liContador3 = 1; liContador3 <= liN; liContador3++)
            {
                if (liContador1 * liContador1 == liContador2 * liContador2 + liContador3 * liContador3)
                    printf("(%d, %d, %d)\t", liContador2, liContador3, liContador1);
            }
        }
    }
 
    printf("\n");


Hay demasiados resultados, algunos erróneos, creo.....
  #7 (permalink)  
Antiguo 28/03/2015, 14:00
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: Ternas Pitagóricas, no logro hacerlo

He cambiado algo en el código:

Código:
    for (liContador1 = 1; liContador1 <= liN; liContador1++)
    {
        for (liContador2 = 1; liContador2 <= liN; liContador2++)
        {
            for (liContador3 = 1; liContador3 <= liN; liContador3++)
            {
                if (liContador1 * liContador1 + liContador2 * liContador2 == liContador3 * liContador3)
                    printf("(%d, %d, %d)\t", liContador1, liContador2, liContador3);
            }
        }
    }


Ahora me da algunos valores diferentes, no sé que hacer, ayuda!!!
  #8 (permalink)  
Antiguo 28/03/2015, 18:30
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Ternas Pitagóricas, no logro hacerlo

Hola RGT.

No entiendo cuál es el problema, el código que mostras da ternas correctas, como podes comprobar:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.   int i,j,k, num = 100;
  5.  
  6.   for(i=1; i <= num; i++)
  7.     for(j=1; j <= num; j++)
  8.       for(k=1; k <= num; k++)
  9.         if(i*i + j*j == k*k)
  10.           printf("(%3d, %3d, %3d) : %4d + %4d = %4d\n",
  11.                  i, j, k, i*i, j*j, k*k);
  12.  
  13.   getchar();
  14.   return 0;
  15. }
No se si te refieres a que el algorímto genera duplas dado que (a*a + b*b) es igual (b*b + a*a)...

Saludos.
  #9 (permalink)  
Antiguo 28/03/2015, 21:40
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: Ternas Pitagóricas, no logro hacerlo

Cita:
Iniciado por ecfisa Ver Mensaje
Hola RGT.

No entiendo cuál es el problema, el código que mostras da ternas correctas, como podes comprobar:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.   int i,j,k, num = 100;
  5.  
  6.   for(i=1; i <= num; i++)
  7.     for(j=1; j <= num; j++)
  8.       for(k=1; k <= num; k++)
  9.         if(i*i + j*j == k*k)
  10.           printf("(%3d, %3d, %3d) : %4d + %4d = %4d\n",
  11.                  i, j, k, i*i, j*j, k*k);
  12.  
  13.   getchar();
  14.   return 0;
  15. }
No se si te refieres a que el algorímto genera duplas dado que (a*a + b*b) es igual (b*b + a*a)...

Saludos.
Hola,
a lo mejor es eso.

Cómo hago para que no genere duplicados?, no se me ocurre nada.

Otra cosa, y si solo quiero generar 5 Ternas, qué debo hacer?.
  #10 (permalink)  
Antiguo 29/03/2015, 01:39
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Ternas Pitagóricas, no logro hacerlo

Hola RGT.

En realidad no es tán complejo, para evitar la repetición de ternas basta con que la segunda variable de control se inicie con el último valor alcanzado por la primera. Y para el número de ternas se puede usar un contador.

A modo de ejemplo, aunque el número de ternas resulta inconexo con el máximo numero (seguramente una invalidará la otra), sería algo como:
Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.   // nro de ternas, máximo nro, contador de ternas
  5.   int ternas = 5, num = 1000,  cont = 1;
  6.   int i, j, k;
  7.  
  8.   for(i = 1; i <= num && cont <= ternas; i++)
  9.     for(j = i; j <= num && cont <= ternas; j++)
  10.       for(k = 1; k <= num && cont <= ternas; k++)
  11.         if (i*i + j*j == k*k) {
  12.           printf("%4d: (%3d, %3d, %3d) : %4d + %4d = %4d\n",
  13.             cont, i, j, k, i*i, j*j, k*k);
  14.           cont++;
  15.         }
  16.  
  17.   getchar();
  18.   return 0;
  19. }

Saludos.
  #11 (permalink)  
Antiguo 29/03/2015, 01:50
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: Ternas Pitagóricas, no logro hacerlo

Cita:
Iniciado por ecfisa Ver Mensaje
Hola RGT.

En realidad no es tán complejo, para evitar la repetición de ternas basta con que la segunda variable de control se inicie con el último valor alcanzado por la primera. Y para el número de ternas se puede usar un contador.

A modo de ejemplo, aunque el número de ternas resulta inconexo con el máximo numero (seguramente una invalidará la otra), sería algo como:
Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.   // nro de ternas, máximo nro, contador de ternas
  5.   int ternas = 5, num = 1000,  cont = 1;
  6.   int i, j, k;
  7.  
  8.   for(i = 1; i <= num && cont <= ternas; i++)
  9.     for(j = i; j <= num && cont <= ternas; j++)
  10.       for(k = 1; k <= num && cont <= ternas; k++)
  11.         if (i*i + j*j == k*k) {
  12.           printf("%4d: (%3d, %3d, %3d) : %4d + %4d = %4d\n",
  13.             cont, i, j, k, i*i, j*j, k*k);
  14.           cont++;
  15.         }
  16.  
  17.   getchar();
  18.   return 0;
  19. }

Saludos.
Hola, gracias por tratar de ayudarme hermano.

Sigue apareciendo valores innecesarios. Según Wikipedia:
Cita:
Las 16 primeras ternas, con c ≤ 100 son:

( 3 , 4 , 5 ) ( 5, 12, 1) ( 6 , 8 , 10) ( 7, 24, 25)
( 8, 15, 17) ( 9, 40, 41) (11, 60, 61) (12, 35, 37)
(13, 84, 85) (16, 63, 65) (20, 21, 29) (28, 45, 53)
(33, 56, 65) (36, 77, 85) (39, 80, 89) (48, 55, 73)
Código:
Código:
    for (liContador1 = 1; liContador1 <= liN; liContador1++)
    {
        for (liContador2 = liContador1; liContador2 <= liN; liContador2++)
        {
            for (liContador3 = 1; liContador3 <= liN; liContador3++)
            {
                TernasPitagoras(liContador1, liContador2, liContador3);
            }
        }
    }



Aparecen algunos valores que en Wikipedia no estan, qué hago?, estoy perdido en esto.
  #12 (permalink)  
Antiguo 29/03/2015, 14:38
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Ternas Pitagóricas, no logro hacerlo

Hola RGT.
Cita:
Iniciado por RGT Ver Mensaje
Sigue apareciendo valores innecesarios. Según Wikipedia:
Cita:
Las 16 primeras ternas, con c ≤ 100 son:

( 3 , 4 , 5 ) ( 5, 12, 1) ( 6 , 8 , 10) ( 7, 24, 25)
( 8, 15, 17) ( 9, 40, 41) (11, 60, 61) (12, 35, 37)
(13, 84, 85) (16, 63, 65) (20, 21, 29) (28, 45, 53)
(33, 56, 65) (36, 77, 85) (39, 80, 89) (48, 55, 73)
Aparecen algunos valores que en Wikipedia no estan, qué hago?, estoy perdido en esto.
Si, veo que tenes razón... Pero eso no implica que Wikipedia este en lo correcto.

Te cito algunos casos que cumplen la terna pitagórica y no están contemplados en Wikipiedia,
Código:
(6 ,  8, 10);  6* 6 +  8* 8 = 10*10;  36 +  64 =  100 
(9 , 12, 15);  9* 9 + 12*12 = 15*15;  81 + 144 =  225
(10, 24, 26); 10*10 + 24*24 = 26*26;  100+ 576 =  676
(12, 16, 20); 12*12 + 16*16 = 20*20;  144+ 256 =  400
(14, 48, 50); 14*14 + 48*48 = 50*50;  196+2304 = 2500
...
sin embargo, como podes comprobar, los códigos anteriores si lo hacen.

Saludos.
  #13 (permalink)  
Antiguo 29/03/2015, 21:07
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Ternas Pitagóricas, no logro hacerlo

O___O"

No se que me sorprende mas que ambos wikipedia y tu programa están en lo correcto. O que ambos de ustedes piense que uno u otro este en lo incorrecto.

Lo que pasa es un problema mas fundamental. Un problema de lectura y mas especifico de no saber leer.

Wikipedia te muestra solamente las 16 primeras ternas, no significa que sean todas.

Aquí esta una lista completa:
Código Python:
Ver original
  1. (3, 4, 5),
  2. (6, 8, 10),
  3. (5, 12, 13),
  4. (9, 12, 15),
  5. (8, 15, 17),
  6. (12, 16, 20),
  7. (7, 24, 25),
  8. (15, 20, 25),
  9. (10, 24, 26),
  10. (20, 21, 29),
  11. (18, 24, 30),
  12. (16, 30, 34),
  13. (21, 28, 35),
  14. (12, 35, 37),
  15. (15, 36, 39),
  16. (24, 32, 40),
  17. (9, 40, 41),
  18. (27, 36, 45),
  19. (14, 48, 50),
  20. (30, 40, 50),
  21. (24, 45, 51),
  22. (20, 48, 52),
  23. (28, 45, 53),
  24. (33, 44, 55),
  25. (40, 42, 58),
  26. (36, 48, 60),
  27. (11, 60, 61),
  28. (16, 63, 65),
  29. (25, 60, 65),
  30. (33, 56, 65),
  31. (39, 52, 65),
  32. (32, 60, 68),
  33. (42, 56, 70),
  34. (48, 55, 73),
  35. (24, 70, 74),
  36. (21, 72, 75),
  37. (45, 60, 75),
  38. (30, 72, 78),
  39. (48, 64, 80),
  40. (18, 80, 82),
  41. (13, 84, 85),
  42. (36, 77, 85),
  43. (40, 75, 85),
  44. (51, 68, 85),
  45. (60, 63, 87),
  46. (39, 80, 89),
  47. (54, 72, 90),
  48. (35, 84, 91),
  49. (57, 76, 95),
  50. (65, 72, 97),
  51. (28, 96, 100),
  52. (60, 80, 100)
  #14 (permalink)  
Antiguo 30/03/2015, 04:06
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Ternas Pitagóricas, no logro hacerlo

Hola raizpetia.

Cita:
Lo que pasa es un problema mas fundamental. Un problema de lectura y mas especifico de no saber leer.
Disiento con lo que expresas.

Tomando el código que expuse mas arriba,
Código C:
Ver original
  1. ...
  2. int main() {
  3.  int i,j,k, num = 100;
  4.  
  5.   for(i = 1; i <= num; i++)
  6.     for(j = i; j <= num; j++)
  7.       for(k = j; k <= num; k++)
  8.         if(i*i + j*j == k*k)
  9.           printf("(%3d, %3d, %3d)\t", i, j, k);
  10. ...
genera las primeras 16 ternas ordenadas por el primer término de este modo:
Código:
( 3,  4,  5)    ( 5, 12, 13)    ( 6,  8, 10)    ( 7, 24, 25)
( 8, 15, 17)    ( 9, 12, 15)    ( 9, 40, 41)    (10, 24, 26)
(11, 60, 61)    (12, 16, 20)    (12, 35, 37)    (13, 84, 85)
(14, 48, 50)    (15, 20, 25)    (15, 36, 39)    (16, 30, 34)
Sin embargo según Wikipedia es:
Código:
( 3 , 4 , 5)    ( 5, 12, 13)    ( 7, 24, 25)    ( 8, 15, 17)
( 9, 40, 41)    (11, 60, 61)    (12, 35, 37)    (13, 84, 85)
(16, 63, 65)    (20, 21, 29)    (28, 45, 53)    (33, 56, 65)
(36, 77, 85)    (39, 80, 89)    (48, 55, 73)    (65, 72, 97)
Lo que así expuesto, sin indicar método ni órden de obtención, puede dejar fuera ternas que de acuerdo a otros criterios deberían estar incluidas.

Para mi modo de ver, el problema se genera por diferencia de criterios y no por fallo en la lectura.

Saludos.
  #15 (permalink)  
Antiguo 30/03/2015, 08:10
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: Ternas Pitagóricas, no logro hacerlo

bueno, supongo que es cierto.... Llegué a confundirme bastante!!
  #16 (permalink)  
Antiguo 30/03/2015, 08:33
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Ternas Pitagóricas, no logro hacerlo

Cita:
Iniciado por ecfisa Ver Mensaje
Hola raizpetia.
Gracias por demostrar otra vez mi punto.

Cita:
Iniciado por ecfisa Ver Mensaje
Lo que así expuesto, sin indicar método ni órden de obtención, puede dejar fuera ternas que de acuerdo a otros criterios deberían estar incluidas.

Para mi modo de ver, el problema se genera por diferencia de criterios y no por fallo en la lectura.
Otra vez, si leíste bien, lo que RGT quiere es todas las ternas pitagóricas tales que c <= n.

Lo que RGT no se dio cuenta es que wikipedia solo le da las primeras 16 ternas, pero esto no significa que sean todas las ternas con c <= 100. De ahí su inquietud.

Lo cual, si es un fallo de lectura, porque una cosa es que sepas leer y otra que sepas interpretar y la lectura abarca ambos.
  #17 (permalink)  
Antiguo 30/03/2015, 16:34
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Ternas Pitagóricas, no logro hacerlo

Hola razpeitia.
Cita:
Iniciado por razpeitia Ver Mensaje
Lo que RGT no se dio cuenta es que wikipedia solo le da las primeras 16 ternas
Despojado de toda ironía (no es mi estilo), no sé si me he expresado de forma incorrecta o no has interpretado lo que te intento decir: Me refiero a que las ternas mostradas por Wikipedia bién podrían no ser las primeras 16.

¿ Dirías que estas no son las 16 primeras ?
Código:
(65, 72, 97)	(60, 63, 87)	(60, 80, 100)	(57, 76, 95)	
(54, 72, 90)	(51, 68, 85)	(48, 55, 73)	(48, 64, 80)	
(45, 60, 75)	(42, 56, 70)	(40, 42, 58)	(40, 75, 85)	
(39, 52, 65)	(39, 80, 89)	(36, 48, 60)	(36, 77, 85)
No, por que dependiendo del algorítmo con que fueron obtenidas son tan correctas como cualesquiera que cumplan las condiciones ya sabidas (a^2+b^2=c^2 ; c<=n).

Sin embargo, estoy totalmente de acuerdo con vos en que RGT no interpretó que Wikipedia da como muestra solo 16 ternas.

Saludos.

Etiquetas: hacerlo, int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:19.