Как преобразовать в шестнадцатеричный, используя только циклы while и if-else

Мне нужно преобразовать данное число из десятичного в шестнадцатеричное, используя только циклы, упомянутые в заголовке. Значение «нет» для петель. Пока все работает как преобразование 683. Он печатает 2AB без проблем, а 34821 печатает 8805. Проблема в том, когда между двумя цифрами должно быть целое число. Например, я не могу преобразовать 31388 в 7A9C. Я понимаю, в чем моя проблема, но не знаю, как ее исправить.

import java.util.Scanner;
public class Lab12abHexNumbersTEST
{
   public static void main(String[] args)
   {
     Scanner decimal = new Scanner(System.in);
     System.out.println("Enter a decimal number between 1 and 50,000: ");
     int num = decimal.nextInt();

     String hex1 = ""; 
     String letter = "";
     String hex3 = "";
     String hex_last = "";
     int dec = num;
     while (dec > 0)
     {
         hex1 = (dec % 16) + hex1;

         if (dec % 16 >= 9){
            hex1 = "";

            if (dec % 16 == 15) {
               letter = "F" + letter + hex1;
            } else if (dec % 16 == 14) {
               letter = "E" + letter + hex1;
            } else if (dec % 16 == 13) {
               letter = "D" + letter + hex1;
            } else if (dec % 16 == 12) {
               letter = "C" + letter + hex1;
            } else if (dec % 16 == 11) {
               letter = "B" + letter + hex1;
            } else if (dec % 16 == 10) {
               letter = "A" + letter + hex1;
            } 

            System.out.println(letter);
         }
         hex3 = hex1 + letter;

         dec = dec / 16;

      }

      hex_last = hex3; 
      System.out.println("The decimal number " + num + " in hexadecimal is " 
+ hex_last);
  }   
}  

Не относитесь к буквам как к особому. Установите текущую шестнадцатеричную «цифру» (которая может быть буквой или нет) как строку в переменной, добавьте ее к строке результата, разделите dec на 16 и повторите. Кстати: if-else - это всего лишь инструкция, а не цикл.

Michael Butscher 06.12.2018 02:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 119
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я предложил решение этой проблемы.

Примечание. Я использовал операторы switch, чтобы сделать код более чистым, но я уверен, что вы знаете, как преобразовать их обратно в случаи if / else. Если вам нужна помощь, спрашивайте.

Примечание. Я использовал StringBuilder вместо строк напрямую. Вы можете легко заменить их на строки, но я выбрал конструктор строк, потому что он, опять же, делает код чище.

public static void main(String[] args) {
        int dec = 31388 ;
        StringBuilder hexString = new StringBuilder();

        while (dec != 0){
            int hexDigit = dec%16; // obtain this remainder
            dec /= 16; //update dec

            if (hexDigit < 10) hexString.insert(0, hexDigit);
            else {
                switch (hexDigit) {
                    case 10 :
                        hexString.insert(0, "A");
                        break;
                    case 11 :
                        hexString.insert(0, "B");
                        break;
                    case 12 :
                        hexString.insert(0, "C");
                        break;
                    case 13 :
                        hexString.insert(0, "D");
                        break;
                    case 14 :
                        hexString.insert(0, "E");
                        break;
                    case 15 :
                        hexString.insert(0, "F");
                        break;
                    default: break;
            }
        }
    } // while
    System.out.println(hexString);
}

Выход: 7A9C

конвертируется в блок if / else по запросу:

else {
            if (hexDigit == 10) {
                hexString.insert(0, "A");
            } else if (hexDigit == 11) {
                hexString.insert(0, "B");
            } else if (hexDigit == 12) {
                hexString.insert(0, "C");
            } else if (hexDigit == 13) {
                hexString.insert(0, "D");
            } else if (hexDigit == 14) {
                hexString.insert(0, "E");
            } else if (hexDigit == 15) {
                hexString.insert(0, "F");
            }
        }

Используя строки, решение:

public static void main(String[] args) {
    int dec = 31388;
    String answer = "";

    while (dec != 0){
        int hexDigit = dec%16; // obtain this remainder
        dec /= 16; //update dec

        if (hexDigit < 10) {
            answer = hexDigit + answer;
        }
        else {
            if (hexDigit == 10) {
                answer = "A" + answer;
            } else if (hexDigit == 11) {
                answer = "B" + answer;
            } else if (hexDigit == 12) {
                answer = "C" + answer;
            } else if (hexDigit == 13) {
                answer = "D" + answer;
            } else if (hexDigit == 14) {
                answer = "E" + answer;
            } else if (hexDigit == 15) {
                answer = "F" + answer;
            }
        }
    } // while
    System.out.println(answer);
}

Спасибо за помощь, но не могли бы вы преобразовать переключатели в if-else и конструктор строк в Strings? Когда я попытался это сделать, мне показалось, что я все испортил.

C. Domingos 06.12.2018 21:20

@ C.Domingos переоборудован по запросу. Если возможно, отметьте ответ как принятый. Спасибо.

PhaseRush 07.12.2018 01:08

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

C. Domingos 07.12.2018 01:25

попробуйте заменить hex3 = hex1 + letter; на hex3 = letter + hex1; - я работаю над исправлением для вас.

PhaseRush 07.12.2018 01:26

Я понял. Спасибо за помощь

C. Domingos 07.12.2018 01:30

Я правильно переформатировал ответ с помощью решения, используя строки и блок if / else

PhaseRush 07.12.2018 01:34

@PhaseRush Полагаю, использование Integer.toString(n, 16) запрещено?

Kartik Soneji 19.03.2019 12:55

Если разрешены строковые функции:

import java.util.*;

public static void main(String[] args){
    int dec = 31388 ;
    String digits = "0123456789ABCEDF";
    StringBuilder hexString = new StringBuilder();

    while(dec != 0){
        hexString.insert(0, digits.indexOf(dec % 16));
        dec /= 16;
    }

    System.out.println(hexString);
}

Другие вопросы по теме