Возникли проблемы при заполнении массива двоичных чисел из целого числа - PullRequest
0 голосов
/ 16 сентября 2018

Это вопрос, который нам был задан:

Девять монет помещаются в матрицу 3х3, некоторые лицевой стороной вверх, а некоторые лицевой стороной вниз.Вы можете представить состояние монет, используя матрицу 3x3 со значениями 0 (головы) и 1 (хвосты).Вот несколько примеров:

0 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 1

Каждое состояние также может быть представленоиспользуя двоичное число.Например, предыдущие матрицы соответствуют номерам:

000010000 101001100 110100001

Всего имеется 512 возможностей, поэтому вы можете использовать десятичные числа 0, 1, 2, 3, ..., 511 для представления всех состояний матрицы.

Напишите программу, которая предлагает пользователю ввести число от 0 до 511 и отображает соответствующую матрицу с символами H и T.

Я хочу, чтобы метод toBinary () заполнил массивbinaryNumbers.Я понял, что это не заполняет 0 влево.Я должен обдумать это, но разве это единственная проблема?

//https://www.geeksforgeeks.org/java-program-for-decimal-to-binary-conversion/ 
import java.util.Scanner; 
public class HeadsAndTails {

public static void main(String[] args) {

    Scanner input = new Scanner(System.in); 
    int num = input.nextInt(); 
    int[] binaryNumbers = toBinary(num);

    for (int i = 0; i < 9; i++) {

    printArr(binaryNumbers); 
    System.out.print(binaryNumbers[1]); 
}
}

public static int[] toBinary(int inputtedNumber) { 

    int[] binaryNum = new int[9]; 
    int i = 0; 

    while (inputtedNumber > 0) { 

        binaryNum[i] = inputtedNumber % 2; 
        inputtedNumber = inputtedNumber/2; 
        inputtedNumber++; 

    } return binaryNum; 

} 
public static void printArr(int[] arr) { 

    for (int i = 0; i < 9; i++) {

        if (arr[i] == 0) { 

            System.out.print("H "); 

        } else { 

            System.out.print("T "); 

        }

        if (arr[i+1] % 3 == 0) {

            System.out.println(); 

        } System.out.print(arr[i]);

    } 

}
}

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Я понимаю, что это домашнее задание, поэтому вы должны придерживаться своего текущего подхода.Однако иногда бывает интересно посмотреть, чего можно достичь, используя встроенные функции 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 "));
0 голосов
/ 16 сентября 2018

Похоже, вы увеличиваете неправильную переменную в цикле while:

while (inputtedNumber > 0) { 

    binaryNum[i] = inputtedNumber % 2; 
    inputtedNumber = inputtedNumber/2; 
    i++; // NOT inputtedNumber

} return binaryNum;

Также обратите внимание, что new int[9], вероятно, уже инициализировано в 0 , но если нет, вы можете просто зациклить 9 раз , а не до тех пор, пока inputtedNumber не станет 0

for (int i = 0; i < 9; i++) { 
    binaryNum[i] = inputtedNumber % 2; 
    inputtedNumber = inputtedNumber/2; 
} 
return binaryNum;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...