Test Foro de elhacker.net SMF 2.1

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..


#include<stdio.h>
#include<math.h>
#define LIMITE 500

int compara_vector(double vec[], double num, int indice);

main()
{
      int i, j, k, m = 1;
      double lado1 = (double)1, lado2 = (double)1, hipotenusa = (double)1;
      double num, rtdoH, rtdoLs, rtdoM[LIMITE*2];
     
      printf("\tL1\tL2\t\tHP\n\n");
     
      for (i = 1; i <= LIMITE; i++){
          lado2 = 1;
         
          for ( j = 1; j <= LIMITE; j++){
              hipotenusa = 1;
             
              for (k = 1; k <= LIMITE; k++){
                  rtdoH = pow((hipotenusa), (double)2);
                  rtdoLs = (pow(lado1, (double)2)) + (pow(lado2, (double)2));
                  rtdoM[m] = lado1 * lado2 * hipotenusa;
                                                           
                        if (rtdoH == rtdoLs){
                                  num = rtdoM[m];
                                 
                                  if((compara_vector(rtdoM, num, m)) == 0)
                                                           printf("\t%.0f\t%.0f\t=\t%.0f\n", lado1, lado2, hipotenusa);
                                                           
                                  m++;
                                  }
                  hipotenusa++;
              }
              lado2++;
         }
         lado1++;
      }

      return 0;
}





int compara_vector(double vec[], double num, int indice)
{
     int i;
     
     for(i = indice; i >= 0; i--){
           
           if(vec[i] != num){
                     return 0;
           }
     }
}


Bueno espero sugerencias!!  :D
Título: Re: [C]Terna pitagorica(Fuerza bruta)
Publicado por: leogtz en 12 Agosto 2010, 18:44 PM
double lado1 = (double)1, lado2 = (double)1, hipotenusa = (double)1;

Declaralos directamente como:

double algo = 1.0;

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

CitarConversion 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:


for(hipotenusa == MAX_HIPOTENUSA ; hipotenusa > 1 ; hipotenusa--)
{
    for(cateto1 == hipotenusa - 1 ; cateto1 > 0 ; cateto1--)
    {
        for(cateto2 == hipotenusa - 1 ; cateto2 > 0 ; cateto2--)
        {
            if(hipotenusa * hipotenusa == cateto1 * cateto1 + cateto2 * cateto2)
            {
                /* ahora haces lo que quieras con estos datos ... */
            }
        }
    }
}


¡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!