Convertir un número en una base dada (JAVA)
Rakada
-
KX Mensajes publicados 19031 Estado Moderador -
KX Mensajes publicados 19031 Estado Moderador -
Hola,
El título no es muy claro, lo reconozco, pero quería hacerlo simple y corto. En fin, estoy en terminal y estoy trabajando en un mini proyecto donde me bloqueo bastante. El objetivo es convertir un número N dado de representación decimal a una base b cualquiera elegida por el usuario. La base b debe estar entre 2 y 36 inclusive. Pensé en usar un módulo para obtener el resto y una división para obtener el dígito del resto, ¡un poco lío! Aquí me gustaría recibir ideas sobre cómo lograrlo.
Gracias de antemano.
PD: Preciso que programo con Java con el software Java's cool.
Configuración: Windows 7 / Chrome 24.0.1312.57
El título no es muy claro, lo reconozco, pero quería hacerlo simple y corto. En fin, estoy en terminal y estoy trabajando en un mini proyecto donde me bloqueo bastante. El objetivo es convertir un número N dado de representación decimal a una base b cualquiera elegida por el usuario. La base b debe estar entre 2 y 36 inclusive. Pensé en usar un módulo para obtener el resto y una división para obtener el dígito del resto, ¡un poco lío! Aquí me gustaría recibir ideas sobre cómo lograrlo.
Gracias de antemano.
PD: Preciso que programo con Java con el software Java's cool.
Configuración: Windows 7 / Chrome 24.0.1312.57
1 respuesta
-
"en representación decimal hacia una base b cualquiera"
Atención al vocabulario, si es una base 'b' no es decimal (a menos que b=10...)
"Pensé hacer un módulo para obtener el resto y una división para obtener el dígito del módulo"
La idea es buena, es así como debes hacerlo.
"La base b deberá estar comprendida entre 2 y 36 inclusive"
No son valores elegidos al azar, Java también lo hace en este intervalo, esto permite manipular un alfabeto con los 10 dígitos y 26 letras.
Recordatorio :
N = n0 + 10.n1 + 100.n2 + 1000.n3... = n0 + 10.( n1 + 10.( n2 + 10.( n3... )))
= b0 + b.b1 + b².b2 + b³.b3... = b0 + b.( b1 + b.( b2 + b.( b3 ... )))
--
La confianza no excluye el control-
-
Es la descomposición de un número en dígitos.
Ejemplo en decimal: 1234 = 4 + 3*10 + 2*100 + 1*1000 = 4 + 10 * ( 3 + 10 * ( 2 + 10 * (1 )))
Es así como se obtiene la descomposición por división y resto sucesivos.
[ 4 + 10 * ( 3 + 10 * ( 2 + 10 * (1 ))) ] / 10 = ( 3 + 10 * ( 2 + 10 * (1 ))) le queda 4
[ 3 + 10 * ( 2 + 10 * (1 )) ] / 10 = ( 2 + 10 * (1 )) le queda 3
[ 2 + 10 * (1 ) ] / 10 = ( 1 ) le queda 2
[ 1 ] / 10 = 0 le queda 1
Se obtienen bien los dígitos 1,2,3,4 de la descomposición de 1234 en base 10.
Puedes hacer lo mismo en cualquier base, dividiendo N entre b obtienes el resto b0 y el cociente N' = b1 + b.( b2 + b.( b3 ... )) permite calcular luego b1, b2, b3...
Ejemplo en hexadecimal :
1234 / 16 = 77 le queda 2
77 / 16 = 4 le quedan 13
4 / 16 = 0 le queda 4
Entonces 1234 = 2 + 16 * (13 + 16 * (4)) = 2 + 16 * 13 + 16² * 4
Los dígitos hexadecimales de 1234 son entonces 4, 13, 2, que representaremos como "4d2" -
¡Felicidades! Esto es lo que obtengo para el valor 1234 en base 16:
void main() {
println("Taper un nombre :");
int N = readInteger();
println("Taper une base :");
int b = readInteger();
int r0 = N / b;
int b0 = N % b;
int r1 = r0 / b;
int b1 = r0 % b;
int r2 = r1 / b;
int b2 = r1 % b;
String hex2 = Integer.toHexString(b2);
String hex1 = Integer.toHexString(b1);
String hex = Integer.toHexString(b0);
println(hex2+""+hex1+""+hex);
}
Après par contre je ne sais pas si il faut que je répète ça pour chaque chiffre entré en plus, j'aimerais faire plus simple pour n'importe quel nombre car le programme que je viens de faire de marche que pour un nombre de 4 chiffre pas plus. Pour faire plus il faudrait que je rajoute des b3 et r3, etc mais je pense qu'on peut faire plus simple mais je ne vois pas :/ .
PS: le résultat obtenus en tapant 1234 en base de 16 et bien 4d2 ;) -
Creo que debes evitar usar el método Integer.toHexString, ya que solo vale para la base 16; si tomas b=17, 18... ya no funcionará. Además, es "trampa"; el objetivo de tu programa es hacerlo todo tú mismo, si no usarías directamente el método Integer.toString(n,b) que ya lo hace todo. "debería añadir b3 y r3" Efectivamente, además, si tomas bases pequeñas, tendrás muchos dígitos. Por ejemplo, 1234 en base 2 es "10011010010"... si solo mantienes b0, b1 y b2, no podrías superar n=7 para la base 2, ¡eso es poco! Por lo tanto, debes usar un bucle, para tener tantos b/r como sea necesario sin tener que codificarlos todos uno tras otro tú mismo.
-