elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Triples de pitagoras C++ (Ayuda sobre optimizacion)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Triples de pitagoras C++ (Ayuda sobre optimizacion)  (Leído 7,791 veces)
erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Triples de pitagoras C++ (Ayuda sobre optimizacion)
« en: 10 Septiembre 2013, 02:01 am »

Buenas noches, he hecho un programa sobre Triples de Pitagoras, ¿Es posible que exista una forma mas optimizada? Dejare mi codigo:

Código
  1. /*(Triples de Pitágoras) Un triángulo recto puede tener lados cuyas longitudes sean valores enteros. Un conjunto de tres
  2. valores enteros para los lados de un triángulo recto se conoce como triple de Pitágoras. Estos tres lados deben satisfacer la
  3. relación que establece que la suma de los cuadrados de dos lados es igual al cuadrado de la hipotenusa. Encuentre todos los
  4. triples de Pitágoras para lado1, lado2, y la hipotenusa, que no sean mayores de 500. Use un ciclo for triplemente anidado
  5. para probar todas las posibilidades. Este método es un ejemplo de la computación de fuerza bruta. En cursos de ciencias
  6. computacionales más avanzados aprenderá que existen muchos problemas interesantes para los cuales no hay otra metodología
  7. algorítmica conocida, más que el uso de la fuerza bruta. */
  8.  
  9. #include <iostream>
  10. #include <cmath>
  11. #include <iomanip>
  12.  
  13. using namespace std;
  14.  
  15. int main( int argc, char* args[] )
  16. {
  17.    int lado1 = 1, lado2 = 1, hipotenusa = 1;
  18.    double res_pow_lado2, res_pow_hipotenusa;
  19.  
  20.    cout << "Lado1 al cuadrado ------ Lado2 al cuadrado ------ Hipotenusa al cuadrado" << endl << endl;
  21.  
  22.    for( ;; hipotenusa++ )
  23.    {
  24.        res_pow_hipotenusa = pow( hipotenusa, 2 );
  25.        for( ;; lado2++ )
  26.        {
  27.            res_pow_lado2 = pow( lado2, 2 );
  28.            for( ;; lado1++ )
  29.            {
  30.                if( pow( lado1, 2 ) + res_pow_lado2 == res_pow_hipotenusa )
  31.                {
  32.                    cout << lado1 << " = " << pow( lado1, 2 ) << setw(20) << lado2 << " = " << res_pow_lado2 << setw(20) << hipotenusa << " = " << res_pow_hipotenusa << endl;
  33.                }
  34.                if( pow( lado1, 2 ) + res_pow_lado2 > 500 )
  35.                    break;
  36.            }
  37.            lado1 = 1;
  38.            if( lado1 + res_pow_lado2 > 500 )
  39.                break;
  40.        }
  41.        lado2 = 1;
  42.        if( res_pow_hipotenusa > 500 )
  43.            break;
  44.    }
  45.  
  46.    cin.get();
  47. return 0;
  48. }
  49.  
  50.  

Gracias.

EDIT: Me gustaria saber si existe una manera de comprobar que ese es el resultado correcto :S, es decir, si no existen mas combinaciones.

EDIT2: Me di cuenta que las variables res_pow... deben ser double.


« Última modificación: 10 Septiembre 2013, 03:04 am por erest0r » En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
ecfisa

Desconectado Desconectado

Mensajes: 114


Ver Perfil
Re: Triples de pitagoras C++ (Ayuda sobre optimizacion)
« Respuesta #1 en: 10 Septiembre 2013, 06:41 am »

Hola erest0r.

Proba de este modo:

Código
  1. #include <iostream>
  2. #include <iomanip>
  3.  
  4. #define MAX 500
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.  cout << "   h" << "   c1" << "   c2" << "    V" << endl;
  11.  cout << "---------------------" << endl;
  12.  
  13.  for (int h = 1; h*h <= MAX; h++) {
  14.    for(int a = 1; a < h; a++)
  15.      for(int b = 1; b < h; b++)  // (*)
  16.        if (h*h == a*a + b*b)
  17.          cout << "(" << setw(3) << h << "," << setw(3) << a
  18.               << "," << setw(3) << b << " ) = " << h*h << endl;
  19.  }
  20.  return 0;
  21. }

Pero hay algo del enunciado (comentado en el código) que no me quedó claro y es que si se toman como válidas aquellas ternas que tengan iguales valores en catetos diferentes, como por ejemplo:
Código:
h = 5, c1 = 3, c2 = 4
h = 5, c1 = 4, c2 = 3

De no ser así, tendrías que cambiar la línea (*) por:
Código
  1.  ...  
  2.    for(int b = 1; b < a; b++)
  3.    ...
  4.  

Saludos :)

 


« Última modificación: 10 Septiembre 2013, 06:58 am por ecfisa » En línea

erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Triples de pitagoras C++ (Ayuda sobre optimizacion)
« Respuesta #2 en: 10 Septiembre 2013, 07:02 am »

Hola ecfisa, no sabria decirte si es necesario o no mostrar ambos catetos con valores invertidos ya que ese ejercicio lo tome de un libro PDF que estoy practicando, me gusto tu solucion, se ve mucho mas rapido de entender que esa maraña de codigo que hice  :), gracias.
En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Curiosidad sobre optimización de memoria
.NET (C#, VB.NET, ASP)
Meta 9 7,595 Último mensaje 8 Diciembre 2009, 04:51 am
por Foxy Rider
[C] Teorema de Pitágoras « 1 2 3 »
Programación C/C++
STANHMAL 22 20,057 Último mensaje 8 Julio 2010, 02:35 am
por .:BlackCoder:.
[Código] Teorema de Pítagoras [Python]
Scripting
@Sthéfano 0 5,793 Último mensaje 26 Julio 2010, 22:34 pm
por @Sthéfano
sobre la optimización de CGI
Desarrollo Web
nosoqui 1 1,850 Último mensaje 4 Septiembre 2011, 17:22 pm
por nosoqui
Ayuda optimizacion busqueda de salida en laberinto « 1 2 »
Programación C/C++
erest0r 10 6,275 Último mensaje 29 Marzo 2014, 19:18 pm
por erest0r
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines