Java decToHex в рекурсивном — неправильный порядок вывода

#java #recursion #hex

#java #рекурсия #шестнадцатеричный

Вопрос:

Я пытался проверить другие вопросы, близкие к этому, но не смог найти ни одного ответа на свой, поэтому отправил его как новое сообщение. Надеюсь, это не вызовет никаких проблем.

Я пытаюсь написать простой JAVA-код для преобразования чисел — из десятичной в восьмеричную или шестнадцатеричную. С восьмеричным все в порядке, но с шестнадцатеричным вывод находится в неправильном порядке. например, если ответ равен 613 — программа выдает 316.

Вот мой полный код:

 import java.util.Scanner;

public class Cem {
    public static void octalconverter(int a) {
        if (a == 0) { //our base
            System.out.println(); //I first put here return a, but then it was adding zeros to the end
        } else {
            System.out.print(a % 8);// first remainder = last digit, and so on
            octalconverter(a / 8); //recursively going till it is base
        }
    }

    public static void hexconverter(int a) {

        if (a == 0) {
            System.out.println();
        } else {

            System.out.print(hexchart(a % 16));
            hexconverter(a / 16);
        }
    }

    public static String hexchart(int a) {
        String result = "";
        if (a <= 9) {
            result = a   resu<
        } else {
            if (a == 10)
                result = result   "A";
            // System.out.print("A");
            if (a == 11)
                result = result   "B";
            // System.out.print("B");
            if (a == 12)
                result = result   "C";
            // System.out.print("C");
            if (a == 13)
                result = result   "D";
            //System.out.print("D");
            if (a == 14)
                result = result   "E";
            //System.out.print("E");
            if (a == 15)
                result = result   "F";
            // System.out.print("F");
        }
        return resu<
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner oScan = new Scanner(System.in);
        System.out.println("Please enter your decimal number : "); //getting input
        int num = oScan.nextInt(); //assigning
        System.out.println("Enter 1 for Octal Base Conversion   ####  Enter 2 for Hex Conversion");
        int num2 = oScan.nextInt();

        if (num2 == 1) {
            System.out.print(num   " in Octal(base8) system is : ");
            octalconverter(num); //conversion
        } else if (num2 == 2) {
            System.out.print(num   " in Hexadecimal(base16) system is : ");
            hexconverter(num);
        } else {
            System.out.println("You entered a wrong choice for conversion type, please restart the program");
        }
    }
}
  

Не могли бы вы сказать мне, где я ошибся. Я также должен сказать, что я ищу ошибку, которую я сделал здесь, а не другой способ написания этого кода. Спасибо тем, кто готов поделиться другим способом, но мне снова нужно усвоить свою ошибку здесь.
Спасибо за вашу помощь

Комментарии:

1. Оба восьмеричных и шестнадцатеричных преобразователя неверны, поскольку вы печатаете «последнюю» цифру перед рекурсивным вызовом для печати «более ранних» цифр. Перейдите print() к после рекурсивного вызова.

2. Я запустил ваш код, и результат был: 613 in Hexadecimal(base16) system is : 562 .

3. привет, Андреас, 🙂 еще раз спасибо за помощь. Но восьмеричный дает правильный вывод. также вы имеете в виду, чтобы hexconverter помещал print() после hexconverter(a / 16)??

4. точно, DimaSan, хотя ответ равен 265 для 613, он выводится в неправильном порядке.

Ответ №1:

Изменить

 public static void hexconverter(int a) {
    if (a == 0) {
        System.out.println();
    } else {
        System.out.print(hexchart(a % 16));
        hexconverter(a / 16);
    }
}
  

Для

 public static void hexconverter(int a) {
    if (a == 0) {
        System.out.println();
    } else {
        hexconverter(a / 16);
        System.out.print(hexchart(a % 16));
    }
}
  

Ваше восьмеричное преобразование также не работает должным образом. Он печатает в обратном порядке. Так что просто поменял местами и эти инструкции.

Комментарии:

1. Когда я попробовал это, он ничего не распечатывает. вы уверены?

2. О да, извините, пользователь2509521, это было в следующей строке, вот результат:

3. выполнить: Пожалуйста, введите свое десятичное число: 613 Введите 1 для преобразования в восьмеричное число #### Введите 2 для преобразования в шестнадцатеричное число 2 613 в шестнадцатеричной (base16) системе: 265BUILD УСПЕШНО (общее время: 7 секунд)

4. Да, я это сделал. Еще раз большое вам спасибо за вашу помощь

Ответ №2:

Билл Гейтс однажды сказал, что он всегда будет «нанимать ленивого человека для выполнения сложной работы» в Microsoft. … «Потому что ленивый человек найдет простой способ сделать это».

Я знаю, вы сказали, что не ищете другого способа написания этого кода, но это гораздо более простой способ выполнить работу.


 public static String octalNumber = "";

public static void octalconverter(int a){

   while(a!=0){
       octalNumber = octalNumber   String.valueOf(a%8);
       a = a/8;
   }
    System.out.println(new StringBuilder(octalNumber).reverse().toString());

}
  

Окончательное число должно быть отменено.Это была ошибка.

Комментарии:

1. Почо, ты прав, но мне разрешено использовать только рекурсивные, а while — это итерация, которую я не могу использовать. 🙂 Но, да, если бы не было ленивых людей, мы все бы все еще ходили, кто-то в истории был слишком ленив, чтобы ходить, и именно поэтому он изобрел автомобиль, скорее всего, другой кто-то (или кто-то) был слишком ленив, чтобы использовать автомобиль, вот почему они изобрелиплоскость. Будем надеяться, что скоро придет другой ленивый человек, и мы получим телепортацию 🙂