Portada arrow Algoritmos arrow Cambio de base de un número natural
Cambio de base de un número natural
viernes, 09 de marzo de 2007
Índice del Artículo
Cambio de base de un número natural
Hexadecimal, binario y octal
Algoritmo: De cualquier base a su valor
Algoritmo: De natural a cualquier base
Optimizaciones

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#

pseudo

//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
 

CSharp

//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;
}
 
 



 
←Artículo anterior   Artículo siguiente→

Categorías

¿Quién está en línea?

 web tracker

Suscríbete

RSS feed Sindicación RSS

(¿Qué es la sindicación RSS?)


Suscribir por e-mail

¿Dónde estoy?

Estás en La tecla de ESCAPE, un sitio web personal en el que nos gusta hablar de algoritmos, informática, tecnología, ciencia, ingeniería, internet... y cualquier tontería que se nos ocurra. El punto de vista de nuestros artículos técnicos suele ser muy básico, así que a menudo adoptamos grandes simplificaciones. (Más...-Términos de uso)