Я понимаю, что это домашнее задание, поэтому вы должны придерживаться своего текущего подхода.Однако иногда бывает интересно посмотреть, чего можно достичь, используя встроенные функции Java.
Класс Integer
имеет метод toBinaryString
, который является хорошей отправной точкой:
int n = 23;
String s1 = Integer.toBinaryString(n);
System.out.println(s1);
Вывод: 10111
Но, как мы видим, этопропускает ведущий 0s
.Мы можем получить их обратно, убедившись, что наш номер имеет значащую цифру на 10-м месте, используя небольшую перестановку:
String s2 = Integer.toBinaryString(1<<9 | n);
System.out.println(s2);
Вывод: 1000010111
Но теперь мы имеемведущий 1
, который мы не хотим.Мы уберем это с помощью String.substring
, и пока мы на нем, мы будем использовать String.replace
для замены 0
на H
и 1
на T
:
String s3 = Integer.toBinaryString(1<<9 | n).substring(1).replace('0','H').replace('1','T');
System.out.println(s3);
Вывод: HHHHTHTTT
Теперь мы можем напечатать эту строку в матричной форме, снова используя substring
для извлечения каждой строки и replaceAll
для вставки нужных пробелов:
for(int i=0; i<9; i+=3)
System.out.println(s3.substring(i, i+3).replaceAll("", " ").trim());
Вывод:
H H H
H T H
T T T
Если мы немного разберемся с волшебством регулярных выражений (найдено здесь и здесь ), мы можем сделать еще лучше:
for(String sl : s3.split("(?<=\\G.{3})"))
System.out.println(sl.replaceAll(".(?=.)", "$0 "));
Собрав все вместе, мы получим:
int n = 23;
String s3 = Integer.toBinaryString(1<<9 | n).substring(1).replace('0','H').replace('1','T');
for(String s : s3.split("(?<=\\G.{3})"))
System.out.println(s.replaceAll(".(?=.)", "$0 "));