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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C]Terna pitagorica(Fuerza bruta)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C]Terna pitagorica(Fuerza bruta)  (Leído 5,429 veces)
HRSLASH

Desconectado Desconectado

Mensajes: 33



Ver Perfil
[C]Terna pitagorica(Fuerza bruta)
« 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


En línea

La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: [C]Terna pitagorica(Fuerza bruta)
« Respuesta #1 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.


« Última modificación: 12 Agosto 2010, 18:49 pm por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
HRSLASH

Desconectado Desconectado

Mensajes: 33



Ver Perfil
Re: [C]Terna pitagorica(Fuerza bruta)
« Respuesta #2 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??
En línea

La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: [C]Terna pitagorica(Fuerza bruta)
« Respuesta #3 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!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
HRSLASH

Desconectado Desconectado

Mensajes: 33



Ver Perfil
Re: [C]Terna pitagorica(Fuerza bruta)
« Respuesta #4 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!
En línea

La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines