[C]Terna pitagorica(Fuerza bruta)

Iniciado por HRSLASH, 12 Agosto 2010, 17:12 PM

0 Miembros y 1 Visitante están viendo este tema.

HRSLASH

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
La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer

leogtz

#1
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.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

HRSLASH

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??
La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer

do-while

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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

HRSLASH

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!
La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer