Bienvenido(a), Visitante. Favor de ingresar o registrarse.

Ingresar con nombre de usuario, contraseña y duración de la sesión

Foros del Club

Páginas: [1]   Ir Abajo
  Enviar tema  |  Imprimir  
Autor Tema: Busqueda BInaria II, Trabajando con numeros Decimales  (Leído 724 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Tavo
Technocrat
*********

Prestigio: 0
Desconectado Desconectado

Sexo: Masculino
Título universitario: Ninguno
Profesión: GameDeveloper(GD) y Desarrollador
Mensajes: 144




Lenguajes:
Visual Basic
Real Basic
Python
C/C++
Java
SQL
Bases de datos:
SQLite
MySQL
« en: 26/07/2006, 21:15:55 »

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:

Código:
#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 Gi&ntilde;ar
En línea

Foros del Club
   

 En línea
Páginas: [1]   Ir Arriba
  Enviar tema  |  Imprimir  
 
Ir a: