Ya con tiempo voy a explicar la busqueda binaria pero trabajando con decimales.
Antes de empezar, vamos a plantear un problema y a evaluarlo:
"X al cuadrado es igual a 4. Buscar el valor de X". Este problema es simple pero mas que nada para apuntar a lo que quiero llegar. Todos sabemos que X es 2 (El que no se dio cuenta por favor no estudie mas ). Si tuvieramos que hacer este problema seria usar un bucle e ir probando diferentes numeros. Claro, es facil ya que seria solo enteros, pero que pasa si en vez de 4 es 30?, ya tendriamos que usar decimales y usar un bucle de decimales tardaria millones de años ya que tendriamos que ir probando numeros realmente muy chicos. Aqui es donde entra la busqueda binaria otra vez.
Vamos a cambiar el enunciado para que sea mas dificil:
"X mas X al cuadrado mas X al cubo mas uno es igual a 1000. Descubrir el valor de X" Vamos a construir le codigo de a poco (Tomando como base el anterior que era de enteros).
AVISO: Este codigo que vamos a hacer funciona y ha sido provado con el compilador Dev-C++
Antes que nada, vienen las librerias que vamos a utilizar. Nuestra amiga iostream y la cstdio. ¿Por que la cstdio?, es muy simple, el cout no se lleva bien con numeros decimales, y ademas, el printf nos permite de una forma practica decir cuantos decimales queremos imprimir.
Bueno, a empezar!, creamos el main (int main(){}), y declaramos tres variables. Dos de ellas, Menor y Mayor. Menor se tiene que iniciar con un valor decimal. Yo eleji 0.001 (Pongan el . porque sino les puede saltar un error), y el mayor con 999. La otra variable se va a llamar Pasos y va a ser iniciada con 0. Esta variable nos va a servir para dar Y pasos y poder parar el programa ya que esta cuenta tiene un resultado aproximado.
Listo!, ahora pasemos a nuestro amigo el bucle while, igual al anterior (while(Menor<=Mayor){}). Lo primero que hacemos es aumentar Pasos en 1, es decir, Pasos++. Ahora declaramos dos variables, las dos dobles. Una se va a llamar Mitad (Muy parecida a la de la anterior busqueda).
La iniciamos asi: Menor+(Mayor-Menor)/2.
Despues TempResu. Esta variable nos va a decir el ResultadoTemporal. Se va a iniciar con el siguiente valor:
Mitad+Mitad*Mitad+Mitad*Mitad*Mitad+1. Despues viene la famosa comparacion (Igual a la anterior busqueda), con la diferencia que el resultado va a ser impreso con printf.
El codigo es el siguiente:
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
double Menor = 0.001, Mayor = 998;
int Pasos = 0;
while(Menor<=Mayor){
Pasos++;
double Mitad = Menor+(Mayor-Menor)/2;
double TempResu = Mitad+Mitad*Mitad+Mitad*Mitad*Mitad+1;
//Vemos cuanto vale TempX (X temporal)
printf("TempX es igual a %.12f", Mitad);
cout << endl;
if(TempResu == 1000){
cout << "X es igual a ";
printf("%.8f", Mitad); //Aclaro que pueden reemplazar 8 por el
//numero de decimales que deseen mostrar
cout << endl;
break;
}else if(TempResu < 1000){
Menor = Mitad;
}else{
Mayor = Mitad;
}
if(Pasos == 40){ break; }
//Impresion del resultado temporal
printf("Resultado temporal %.12f", Mitad+Mitad*Mitad+Mitad*Mitad*Mitad+1);
cout << endl;
}
//Para que no se cierre la ventana
int N;
cin >> N;
return 0;
}
P.D. Si alguien se anima a hacer el pseudocodigo puede
