Algoritmia/Algoritmo para transformar un número en base 10 a otras bases

De Wikilibros, la colección de libros de texto de contenido libre.

Descripción del problema[editar]

El problema radica en la necesidad de saber la equivalencia de un numero en un sistema numérico con base diferente a diez (10) ya que en muchas áreas de las matemáticas y la computación se necesita trabajar en otros sistemas numéricos a parte del decimal como lo son el binario, el octal, el hexadecimal, entre otros. De allí la idea de tener una aplicación que resuelva este problema fácil y rápidamente evitándonos cálculos tediosos y repetitivos.

Limitaciones[editar]

En si esta aplicación no tiene limitaciones en cuanto a la parte del diseño algorítmico ya que este está modelado para transformar cualquier numero sin importar lo grande que sea. La limitación real se encuentra en la maquina ya que esta tiene una memoria que es finita. La aplicación tiene datos de tipo entero, si se va a trabajar con números mucho mas grandes existen los tipos de datos long o los BigInteger que requieren de un manejo diferente pero que no es complicado. Este algoritmo esta diseñado para números enteros mayores o iguales que cero Y la base debe estar entre 2 y 16. Además se debe controlar todo tipo de excepción del lenguaje JAVA.

Solución[editar]

La solución del problema es una aplicación hecha en lenguaje JAVA utilizando una estrategia de programación denominada PROGRAMACION DINAMICA la cual se basa en el uso de tablas o tipos de datos similares para evitar la repetición de cálculos matemáticos. La solución consta de dos clases de las cuales una es utilizada para comenzar la aplicación, pedir los datos al usuario y mostrar los resultados. La otra clase se emplea en la solución del problema mediante métodos matemáticos.

Aplicación implementada en Java[editar]

import javax.swing.JOptionPane;
public class Aplicacion 
{
        public static void main(String[] args) 
        {		
        int numero = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese el número                                                                                      
        a transformar"));
        int base = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese la base"));
        Base bases = new Base(numero,base); 
        bases.transformar();
        JOptionPane.showMessageDialog(null,"El número "+numero+" en base "+base+"                 
        es:\n"+bases.getResultado());
        }
}

class Base 
{
String equivalente;  
int posicion;  
int numero;  
int base;  
int[] digitos;
int[] auxiliar;
                 
        public Base(int n, int b) 
        {
                posicion = 0;
                equivalente = "";
                base = b;
                numero = n;
                digitos = new int [1];
        }
                           
        public void transformar() 
        {
                if(numero<base)
                {
                        digitos[posicion]=numero;
                        tamaño(); 
                }
                else
                {
                        digitos[posicion]=numero%base;
                        tamaño();
                        posicion++;
                        numero = numero/base;
                        transformar(); 
                 }
        }
                  	
        public String getResultado()
        {
                for (int j = digitos.length-2; j >= 0; j--) 
                {
                        equivalente+=Character.toUpperCase(Character.forDigit(digitos[j], 16));
                }
                return equivalente;
        }
                                
        private void tamaño() 
        {
                 auxiliar = digitos;
                 digitos = new int [auxiliar.length+1];
                 System.arraycopy(auxiliar, 0, digitos, 0, auxiliar.length);
        }
}

Descripción del código[editar]

En la Clase Aplicación se piden los datos de entrada y se muestran los resultados finales. El constructor de la clase Base inicializa e instancia todas las variables y los objetos de esta. El método transformar se encarga de la función principal la cual es llevar el numero ingresado en base diez a la base que hemos pedido en un principio. A medida que vamos encontrando un digito del nuevo número se almacena en una casilla del Array digitos el cual por medio del método tamaño va incrementando su capacidad de almacenamiento de uno en uno con ayuda del Array auxiliar. Por último se necesita ordenar los digitos en un String para mostrarlos en el orden que es ya que en el Array digitos estos se encuentran de atrás hacia adelante eso si teniendo en cuenta que cuando la base es mayor a diez los digitos {10,11,12,13,14,15} se deben reemplazar por las letras {A,B,C,D,E,F} respectivamente.

Orden de complejidad[editar]

Este Algoritmo presenta un orden de complejidad O(log (n))

Pruebas[editar]

Ejemplos
Numero Base Resultado
10 2 1010
10 8 12
16 16 10
15455456 2 111010111101010011100000
1089978205 16 40F7BF5D
35655 9 53816
554455 2 10000111010111010111

Forma de compilar y ejecutar[editar]

Se puede compilar y ejecutar en cualquier IDE que reconozca lenguaje JAVA como lo es el JCREATOR o el ECLIPSE en cualquiera de sus versiones. Para ejecutarlo se debe crear un proyecto que contenga estas dos clases(Aplicación, Base) y en ellas copiar el código que aparece anteriormente.

Conclusiones[editar]

→ Se puede concluir primero que todo que la programación dinámica es buena porque nos ayuda a evitar la repetición de cálculos y procesos.

→ Un problema bien solucionado algorítmicamente no tiene limitaciones, como si las tiene una solución mecánica que solo se adapta a unos casos específicos.