es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo convierto un argumento de línea de comandos entero i a base k con bases de hasta 16 utilizando las letras A a F para los dígitos 11-16, respectivamente?

Pregunta:
Modifica el código para obtener un programa que tome dos argumentos enteros desde la línea de comandos, i y k, y convierta i a base k. Se supone que i es un entero del tipo de dato long en Java y que k es un entero entre 2 y 16. Para bases mayores que 10, utiliza las letras A hasta F para representar los dígitos 11 al 16, respectivamente.

He logrado convertir los números decimales a base 2-10 satisfactoriamente, pero no puedo parecer de convertir los números decimales con la inclusión de los caracteres A hasta F que representan los dígitos 11 al 16, respectivamente.

No quiero utilizar arrays o listas. Entiendo que mi declaración switch está faltando funcionalidad que resolvería mi problema, pero no estoy seguro de cómo mejorarla. Estoy intentando resolver el problema utilizando una declaración switch.

En el código, i representa un 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;
        }   // Ahora power es la potencia más grande de 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;
            }
        }
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para convertir decimales con bases mayores a 10, es necesario modificar aún más el código. Una forma de hacerlo es utilizando una declaración switch dentro del bucle que convierte el decimal a la base deseada. Así es como puedes modificar el código:

    public class BaseConversion {
        public static void main(String[] args) {
            long i = Long.parseLong(args[0]);
            int k = Integer.parseInt(args[1]);
    
            StringBuilder sb = new StringBuilder();
            while (i > 0) {
                long rem = i % k;
                if (rem >= 10) {
                    switch ((int) rem) {
                        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;
                    }
                } else {
                    sb.append(rem);
                }
    
                i /= k;
            }
            System.out.println(sb.reverse());
        }
    }
    

    En este código, utilizamos un StringBuilder para construir el resultado en orden inverso. Utilizamos un bucle while para extraer cada dígito del decimal i calculando el resto al dividirlo por k, el cual se almacena en la variable rem. Luego utilizamos una declaración switch para convertir los dígitos mayores a 9 en su representación de caracteres correspondiente (‘A’ a ‘F’). Finalmente, agregamos tanto el dígito como el carácter al StringBuilder y dividimos i por k.

    Después del bucle, invertimos el contenido del StringBuilder y lo mostramos en la consola. Ten en cuenta que hemos cambiado el tipo de i a long para manejar valores grandes.

Comments are closed.