|
Página 3 de 5 ALGORITMO: De cualquier base a su valor. Con todo lo que sabemos hasta ahora, ya podemos obtener un par de algoritmos, pero antes tenermos que decidir un alguna que otra cosa. El primero de nuestros algoritmos aceptará como entrada la representación de un número natural en cualquier base y la propia base en la que está representado, y devolverá un entero con el valor del número representado. Debemos decidir por un lado cuál va a ser la base máxima que aceptemos. En este caso va a ser la 16, pero puedes adaptar fácilmente el algoritmo a cualquier otra. El motivo es que debemos tener claros cuáles van a ser los dígitos que utilicemos. Por otro lado, nuestro algoritmo debería comprobar que la representación del número natural que se acpete como entrada sea válida. Si la base o la representación del entero no son válidos, deberíamos indicarlo de alguna manera, para evitar que se produzca GIGO o que el algoritmo falle. Como vamos a devolver un entero y sólo vamos a trabajar con naturales, devolveremos un -1 en caso de que los datos de entrada no sean válidos. Para la representación del dato de entrada, necesitamos una tira de dígitos, así que como tipo de datos escogeremos una cadena. A continuación, una descripción en pseudocódigo del algoritmo y una implementación sencilla en C# //n=representación de un entero en una base
//b=base en la que está representado
//devuelve un entero mayor que 0 si la conversión se
//realiza correctamente, y -1 en otro caso
funcion CualquierBaseAEntero(n:cadena, base: entero):entero
variables:
p:entero; //posicion
i:entero;
resultado:entero=0;
empieza
Comprobar que 2<=base<=16 y que n es una
representación válida para esa base.
Si no es así, devolver -1 y terminar.
para p desde 0 hasta tamaño(n)-1 hacer
i=valor del dígito en posicion tamaño(n)-1-p
resultado=resultado+i*base^p
fin para
devolver resultado
termina
//n=representación de un entero en una base
//b=base en la que está representado
//devuelve un entero mayor que 0 si la conversión se
//realiza correctamente, y -1 en otro caso
int CualquierBaseAEntero(String n, int b)
{
//Utilizaremos una cadena para
//almacenar los dígitos. La posicion en
//esta cadena nos da el valor de cada
//dígito
String digitos = "0123456789ABCDE";
int resultado = -1;
//comprobar que la base es válida
if (b >= 2 && b <= 16)
{
resultado = 0;
//comprobar que n es válido en base b
//lo haremos a la vez que intentamos convertir
int p = 0;
//nos mantendremos en el bucle mientras que
//no hayamos acabado y los dígitos que encontremos
//sean válidos en base b
while (p <n.Length && resultado >= 0)
{
int i = digitos.IndexOf(n[n.Length-1-p]);
if (i >= 0 & i<b) //es un dígito válido
{
resultado += i * (int)Math.Pow(b,p);
}
else
{
resultado = -1;
}
p++;
} //while
}//if
return resultado;
}
|