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.
Apuesto mi laptop, a que no es un reto, sino una tarea. :D
Viendo que no se animan, no tengo mas remedio que dejar aqui la solucion, para las h4xoRs Desconfiados. Un gusto en compartirlo con vosotros:
/* 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! ::)
Se agradece el aporte.
Saludos
El primero puede hacerse bastante más corto haciéndolo recursivamente. No lo probado, pero deberían funcionar las dos funciones.
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.
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));
}
ghastlyX: Estan muy bien tus codes, ahora cuando saque tiempo, los revisare, porque aun no los comprendo del todo. Gracias por aportar :P