Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Java => Mensaje iniciado por: Dnk! en 29 Noviembre 2010, 23:28 PM

Título: [RETO ABIERTO] Cambio de base ~
Publicado por: Dnk! en 29 Noviembre 2010, 23:28 PM
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.
Título: Re: [RETO ABIERTO] Cambio de base ~
Publicado por: Shell Root en 29 Noviembre 2010, 23:41 PM
Apuesto mi laptop, a que no es un reto, sino una tarea. :D
Título: Re: [RETO ABIERTO] Cambio de base ~
Publicado por: Dnk! en 30 Noviembre 2010, 20:52 PM
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!  ::)
Título: Re: [RETO ABIERTO] Cambio de base ~
Publicado por: Debci en 1 Diciembre 2010, 22:16 PM
Se agradece el aporte.

Saludos
Título: Re: [RETO ABIERTO] Cambio de base ~
Publicado por: ghastlyX en 2 Diciembre 2010, 17:00 PM
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));
}
Título: Re: [RETO ABIERTO] Cambio de base ~
Publicado por: Dnk! en 2 Diciembre 2010, 20:28 PM
ghastlyX: Estan muy bien tus codes, ahora cuando saque tiempo, los revisare, porque aun no los comprendo del todo. Gracias por aportar  :P