Mensaje de pregunta: Modifique Binary para obtener un programa que tome dos argumentos de línea de comando enteros i y k y convierta i en base k. Suponga que i es un número entero en el tipo de datos largo de Java y que k es un número entero entre 2 y 16. Para bases mayores que 10, use las letras de la A a la F para representar los dígitos 11 a 16, respectivamente.
Logré convertir decimales a base 2-10 con éxito, pero parece que no puedo convertir decimales con la inclusión de los caracteres A a F que representan los dígitos 11 a 16, respectivamente.
No quiero usar matrices o listas. Entiendo que mi declaración de cambio carece de funcionalidad que resolvería mi problema, pero no estoy seguro de cómo mejorarlo. Estoy tratando de resolver el problema usando una declaración de cambio.
En el código, i representa un número entero para convertir a base k. k representa una base que puede ser 2-16.
public class BaseConversion { public static void main(String[] args) { int i = Integer.parseInt(args[0]); int k = Integer.parseInt(args[1]); int power = 1; while (power <= i/k) { power *= k; } // Now power is the largest power of k <= i. if (k <= 10) { while (power > 0) { int digit = i / power; System.out.print(digit); i -= digit * power; power /= k; } } else if (k > 10) { switch (k) { case 11: System.out.println('A'); break; case 12: System.out.println('B'); break; case 13: System.out.println('C'); break; case 14: System.out.println('D'); break; case 15: System.out.println('E'); break; case 16: System.out.println('F'); break; } } } }Si necesita convertir un número entero (que es base 10) a cualquier otra base usando una declaración de cambio único, puede usar algo como esto:
int i = //take from CLI int k = //take from CLI int num = i; //copy so we still have the original input //we need a string to represent anything but base-10 integers StringBuilder sb = new StringBuilder(); //decompose the input while( num > 0 ) { //extract the last digit int digit = num % k; //map the digit to a character - note: this is NOT k but the digit we extracted from the input switch(digit) { case 0,1,2,3,4,5,6,7,8,9: sb.append(digit); break; case 10: sb.append("A"); break; case 11: sb.append("B"); break; case 12: sb.append("C"); break; case 13: sb.append("D"); break; case 14: sb.append("E"); break; case 15: sb.append("F"); break; } //reduce the magnitude of the number by 1, ie divide by the base num /= k; } //we extracted the digits from the back so we need to reverse the string for proper left-to-right output String result = sb.reverse().toString();Esto debería ayudarte a empezar. Tenga en cuenta que carece de un par de comprobaciones, por ejemplo, si k está en el rango [2,16]. También funciona con números positivos hasta ahora, pero la entrada negativa podría manejarse fácilmente multiplicando el número con -1 y agregando el signo al búfer de cadena antes de la conversión.
Hay varios problemas en el código presentado:
switch deben desplazarse hacia abajo en 1: 10 -> a , 11 -> b , .. 15 -> f Por lo tanto, se debe usar un StringBuilder para acumular el resultado. Si la entrada es negativa, se debe agregar el signo menos y el signo se invierte, luego los dígitos se calculan utilizando módulo por k y se insertan en el resultado en orden inverso.
private static String convert(long n, int k) { assert(2 <= k && k <= 16); StringBuilder sb = new StringBuilder(); int p = 0; if (n < 0) { sb.append('-'); n *= -1; p = 1; } while (n > 0) { int digit = (int) (n % k); n /= k; if (digit < 10) { sb.insert(p, digit); } else { sb.insert(p, switch(digit) { case 10 -> 'a'; case 11 -> 'b'; case 12 -> 'c'; case 13 -> 'd'; case 14 -> 'e'; default -> 'f'; // the only remaining option }); } } return sb.toString(); } De manera similar, el resultado puede recopilarse en un String en lugar de StringBuilder . Sin embargo, este enfoque generalmente no se recomienda (concatenación de cadenas en un bucle):
private static String convert(long n, int k) { String s = ""; String sign = ""; if (n < 0) { sign = "-"; n *= -1; } while(n > 0) { int digit = (int) (n % k); n /= k; if (digit < 10) { s = digit + s; } else { s = switch(digit) { case 10 -> 'a'; case 11 -> 'b'; case 12 -> 'c'; case 13 -> 'd'; case 14 -> 'e'; default -> 'f'; } + s; } } return sign + s; }