[RETO ABIERTO] Cambio de base ~

Iniciado por Dnk!, 29 Noviembre 2010, 23:28 PM

0 Miembros y 1 Visitante están viendo este tema.

Dnk!

Reto abierto:

# Se puede realizar en cualquier lenguaje.
# Tipo de Reto: Ejercicio sencillo
# Categoria: Abierto
# Fecha de entrega: 04/11/2010 , empiezan votaciones el 04/11/2010
# Sources abiertos: Sí

Citar
1)Escriba un programa JAVA que lea del teclado un entero en base 10 y escriba la secuencia de
caracteres que representa dicho número en la base especificada:
Introduce un entero (base 10): 4833
Introduce una base: 25
El número leído en base 25 es:7I8 (es una i, no un uno)

2)Escriba un programa JAVA que lea del teclado un entero, indicando la base en la que está
expresado y una secuencia de caracteres que represente un número en dicha base, y escriba su
valor en base 10.
Base: 25
Número en base 25:7I8 (es una i, no un uno)
El número leído en base 10 es:4833

Nota: Hay 25 caracteres de la 'A' a la 'Z'. Por lo tanto podemos representar números desde base 2
hasta base 36. Debes leer las secuencias hasta que encuentres un carácter no válido para la base
introducida.




Comentar es agradecer.
Visita Mi Blob

Shell Root

Apuesto mi laptop, a que no es un reto, sino una tarea. :D
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

Dnk!

Viendo que no se animan, no tengo mas remedio que dejar aqui la solucion, para las h4xoRs Desconfiados. Un gusto en compartirlo con vosotros:

Código (java) [Seleccionar]

/* AUTOR: d3n3k4 (Dnk!)
* FECHA: 30/NOV/2010
* DESCRIPCION:
* - AnyDecimalToBaseN: Convierte un numero decimal a otro en Base N "2..36"
* - AnyBaseNToDecimal: Convierte un numero en Base N "2..36" a otro decimal
* USO:
* String var = AnyDecimalToBaseN(334,2);
* long var = AnyBaseNToDecimal("334",16);
* NOTA: Este codigo es libre y puede ser usado,modificado... siempre y cuando se
* mantenga los creditos y comentarios del autor.
*/

public class conversorNBases {
public static String AnyDecimalToBaseN (long numero,int base) {
String resultado = "";
long potMax = 0,res = 0;

while (numero>=Math.pow(base, potMax + 1))
potMax++;

while (potMax >= 0) {
res = numero/(long)Math.pow(base, potMax);
if (res > 9)
resultado += (char)(res+55);
else
resultado += res;
if (numero >= Math.pow(base, potMax))
numero = numero%(long)Math.pow(base, potMax);
potMax--;
}
return resultado;
}
public static long AnyBaseNToDecimal(String numero,int base) {
long resultado = 0;
char[] V_numero = numero.toCharArray();

for (int i = 0; i < V_numero.length; i++) {
resultado = resultado * base;
resultado = resultado + Character.getNumericValue(V_numero[i]);
}
return resultado;
}
}


xDnk!  ::)




Comentar es agradecer.
Visita Mi Blob

Debci


ghastlyX

#4
El primero puede hacerse bastante más corto haciéndolo recursivamente. No lo probado, pero deberían funcionar las dos funciones.
Código (java) [Seleccionar]
public class conversor {
    public static String decimalBase(long x, int base) {
        String res;
        if (x%base <= 9) res = new String(String.valueOf((char)(x%base + '0')));
        else res = new String(String.valueOf((char)(x%base - 10 + 'A')));
        if (x/base > 0) res = decimalBase(x/base, base).concat(res);
        return res;
    }

    public static long baseDecimal(String numero, long base) {
        long res = 0;
        for (int i = 0; i < numero.length(); ++i)
            res = res*base + (long)Character.getNumericValue(numero.charAt(i));
        return res;
    }
}


Siento si hay algo del código que no sea necesario, como por ejemplo castings. Java no es el lenguaje que uso habitualmente.

EDITO:
No había visto lo de en cualquier lenguaje. Pongo la primera función en C++ de una forma más compacta.
Código (cpp) [Seleccionar]
typedef long long ll;

string dtoB(ll x, int b) {
    return ((x/b > 0)?dtoB(x/b, b):"") + char(x%b + (x%b < 10)*'0' + (x%b >= 10)*('A' - 10));
}

Dnk!

ghastlyX: Estan muy bien tus codes, ahora cuando saque tiempo, los revisare, porque aun no los comprendo del todo. Gracias por aportar  :P




Comentar es agradecer.
Visita Mi Blob