Мне нужно преобразовать данное число из десятичного в шестнадцатеричное, используя только циклы, упомянутые в заголовке. Значение «нет» для петель. Пока все работает как преобразование 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);
}
}




Я предложил решение этой проблемы.
Примечание. Я использовал операторы 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 переоборудован по запросу. Если возможно, отметьте ответ как принятый. Спасибо.
Прошу прощения за последнее. Я ввел то, что вы положили, а затем изменил построитель строк на обычную строку, но результат был обратным. Я постараюсь опубликовать код, чтобы вы понимали, что я имею в виду
попробуйте заменить hex3 = hex1 + letter; на hex3 = letter + hex1; - я работаю над исправлением для вас.
Я понял. Спасибо за помощь
Я правильно переформатировал ответ с помощью решения, используя строки и блок if / else
@PhaseRush Полагаю, использование Integer.toString(n, 16) запрещено?
Если разрешены строковые функции:
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);
}
Не относитесь к буквам как к особому. Установите текущую шестнадцатеричную «цифру» (которая может быть буквой или нет) как строку в переменной, добавьте ее к строке результата, разделите
decна 16 и повторите. Кстати:if-else- это всего лишь инструкция, а не цикл.