Распечатать символы гексаграммы Yijing

1

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

Во-первых, позвольте мне объяснить эту задачу. Это о "Символах гексаграммы Ицзина". Левый - это оригинал, а правильный - результат, который должен дать мне мой код. Изображение 174551 В принципе, каждая "гексаграмма" содержит 6 строк, которые могут быть либо погружены, либо нет.

Таким образом, существует

2 ^ 6 = 64 возможных "гексаграммы"

Задача состоит в том, чтобы вычислить и закодировать метод для печати всех возможных комбинаций.

Вот что я до сих пор:

public class test {

    public String toBin (int zahl) {
        if(zahl ==0) return "0";
        if (zahl ==1 ) return "1";
        return ""+(toBin( zahl/2)+(zahl%2));
    }

    public void show (String s) {
        for (char c : s.toCharArray()){
            if (c == '1'){
                System.out.println("--- ---");
            }
            if(c=='0'){
                System.out.println("-------");
            }

        }
    }

    public void ausgeben (){
        for(int i = 0 ; i < 64; i++) {
            show (toBin(i));
        }
    }
}

Проблема в том, что когда я тестирую "show" -methode с "10", я получаю 3 строки, а не 2, как предполагалось.

public class runner {

    public static void main(String[] args){
        test a = new test();
        a.ausgeben();
        a.show("10");
    }
}

Другая проблема, с которой я столкнулся, заключается в том, что, поскольку я конвертирую в двоичный файл, иногда не хватает строк, потому что, например, 10 в двоичном формате - 0001010, но первое "0" отсутствует. Как я могу реализовать их в простой форме, не меняя многого?

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

  • 0
    Обычно начальные нули опускаются, если вы просто распечатываете цифру. Тем не менее, есть варианты форматирования, если вы хотите, чтобы начальные нули были.
  • 0
    Вот как для моего примера, но метод 'show' нуждается в них. Что вы имеете в виду под параметрами форматирования? Можете привести пример?
Показать ещё 2 комментария
Теги:
arrays
recursion

3 ответа

2
Лучший ответ

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

Например, вы можете сделать что-то вроде:

public String padToSix( String binStr ) {
    return "000000".substring( 0, 5 - binStr.length() ) + binStr;
}

Это проверит, сколько времени занимает ваша строка, и занять столько нулей, чтобы заполнить ее до шести из строки "000000".

Или вы можете просто заменить свой метод преобразования (который является рекурсивным и не очень необходимым) с тем, который специализируется на шестизначных числах:

public static String toBin (int zahl) {
    char[] digits = { '0','0','0','0','0','0' };
    int currDigitIndex = 5;

    while ( currDigitIndex >= 0 && zahl > 0 ) {
        digits[currDigitIndex] += (zahl % 2);
        currDigitIndex--;
        zahl /= 2;
    }

    return new String(digits);
}

Это изменяет массив символов (который изначально имеет только нули) справа налево. Он добавляет значение текущего бита в символ в данном месте. '0' + 0 - '0', а '0' + 1 - '1'. Поскольку вы заранее знаете, что у вас есть шесть цифр, вы можете начать с правой и идти влево. Если ваш номер имеет только четыре цифры, ну, две цифры, которые мы не коснулись, будут '0' потому что это так, как инициализировался массив символов.

Есть действительно много методов для достижения того же.

  • 0
    Ах! Я вижу, поэтому я должен использовать тот факт, что это должен быть максимум 6-значный двоичный код. Спасибо большое
3

Вам может быть проще, если вы используете метод Integer.toBinaryString сочетании с String.format и String.replace.

String binary = String.format("%6s", Integer.toBinaryString(zahl)).replace(' ', '0');

Это преобразует число в двоичное, форматирует его в поле шесть пробелов шириной (с ведущими пробелами по мере необходимости), а затем заменяет пробелы '0'.

2

Ваша проблема сводится к печати всех двоичных строк длиной 6. Я бы пошел с этим фрагментом кода:

  String format = "%06d";
  for(int i = 0; i < 64; i++)         
  {    
    show(String.format(format, Integer.valueOf(Integer.toBinaryString(i))));
    System.out.println();
  }

Если вы не хотите печатать ведущие нули, замените String.format(..) на Integer.toBinaryString(i).

  • 1
    Это очень умно, преобразовать его в двоичную строку, а затем обратно в целое число, чтобы вы могли использовать формат %06d . Я сделал нечто подобное, но с форматом %6s в двоичной строке, а затем заменил пробелы нулями.
  • 0
    Я все еще новичок в Java, так что вы могли бы объяснить переменную n?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню