Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: HRSLASH en 12 Agosto 2010, 17:12 pm



Título: [C]Terna pitagorica(Fuerza bruta)
Publicado por: HRSLASH en 12 Agosto 2010, 17:12 pm
Hola, dejo un programa q saca ternas pitagoricas(a˛+b˛=c˛) mediante fuerza bruta.. El problema q tengo es q no puedo hacer q descarte las ternas q son iguales(ej: 3˛+4˛ = 5˛ -- 4˛+3˛ = 5˛).
En el codigo hay varias sentencias q estan de mas pq las hice para armar la funcion q tendria q descartar los repetidos, las dejo para q vean lo q trataba de hacer, pero si se le sacan el codigo anda igual..

Código
  1. #include<stdio.h>
  2. #include<math.h>
  3. #define LIMITE 500
  4.  
  5. int compara_vector(double vec[], double num, int indice);
  6.  
  7. main()
  8. {
  9.      int i, j, k, m = 1;
  10.      double lado1 = (double)1, lado2 = (double)1, hipotenusa = (double)1;
  11.      double num, rtdoH, rtdoLs, rtdoM[LIMITE*2];
  12.  
  13.      printf("\tL1\tL2\t\tHP\n\n");
  14.  
  15.      for (i = 1; i <= LIMITE; i++){
  16.          lado2 = 1;
  17.  
  18.          for ( j = 1; j <= LIMITE; j++){
  19.              hipotenusa = 1;
  20.  
  21.              for (k = 1; k <= LIMITE; k++){
  22.                  rtdoH = pow((hipotenusa), (double)2);
  23.                  rtdoLs = (pow(lado1, (double)2)) + (pow(lado2, (double)2));
  24.                  rtdoM[m] = lado1 * lado2 * hipotenusa;
  25.  
  26.                        if (rtdoH == rtdoLs){
  27.                                  num = rtdoM[m];
  28.  
  29.                                  if((compara_vector(rtdoM, num, m)) == 0)
  30.                                                           printf("\t%.0f\t%.0f\t=\t%.0f\n", lado1, lado2, hipotenusa);
  31.  
  32.                                  m++;
  33.                                  }
  34.                  hipotenusa++;
  35.              }
  36.              lado2++;
  37.         }
  38.         lado1++;
  39.      }
  40.  
  41.      return 0;
  42. }
  43.  
  44.  
  45.  
  46.  
  47.  
  48. int compara_vector(double vec[], double num, int indice)
  49. {
  50.     int i;
  51.  
  52.     for(i = indice; i >= 0; i--){
  53.  
  54.           if(vec[i] != num){
  55.                     return 0;
  56.           }
  57.     }
  58. }
  59.  

Bueno espero sugerencias!!  :D


Título: Re: [C]Terna pitagorica(Fuerza bruta)
Publicado por: leogtz en 12 Agosto 2010, 18:44 pm
Código
  1. double lado1 = (double)1, lado2 = (double)1, hipotenusa = (double)1;

Declaralos directamente como:

Código:
double algo = 1.0;

Le ahorras al compilador tener que convertir el entero a real.

Citar
Conversion of a signed integer to a float or double takes 4 - 16 clock cycles, depending
on the processor and the type of registers used.


Título: Re: [C]Terna pitagorica(Fuerza bruta)
Publicado por: HRSLASH en 12 Agosto 2010, 19:02 pm
ok grax!! ya lo modifique!! :D El programa tarda varios segundos en terminar por la cantidad de calculos q tiene q hacer. Hay alguna otra modif q se le pueda hacer para q realize los calculos mas rapido??


Título: Re: [C]Terna pitagorica(Fuerza bruta)
Publicado por: do-while en 12 Agosto 2010, 20:46 pm
Tambien puedes ahorrarte el trabajo de llamar a funciones y comprobar directamente lo que dice el teorema:

hipotenusa * hipotenusa == cateto1 * cateto1 + cateto2 * cateto2:

Código
  1. for(hipotenusa == MAX_HIPOTENUSA ; hipotenusa > 1 ; hipotenusa--)
  2. {
  3.    for(cateto1 == hipotenusa - 1 ; cateto1 > 0 ; cateto1--)
  4.    {
  5.        for(cateto2 == hipotenusa - 1 ; cateto2 > 0 ; cateto2--)
  6.        {
  7.            if(hipotenusa * hipotenusa == cateto1 * cateto1 + cateto2 * cateto2)
  8.            {
  9.                /* ahora haces lo que quieras con estos datos ... */
  10.            }
  11.        }
  12.    }
  13. }
  14.  

ˇSaludos!


Título: Re: [C]Terna pitagorica(Fuerza bruta)
Publicado por: HRSLASH en 12 Agosto 2010, 21:04 pm
Gracias x la sugerencia do-while!  :D no habia pensado en hacerlo asi q resultara mas rapido ya q como dices, el programa no tendra q llamar funciones.. voy a modificarlo!
Saludos!