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