打印出Yijing Hexagram符号

时间:2015-02-05 22:21:05

标签: java arrays recursion

我在编码时遇到了问题,我似乎无法找到搞砸的地方,甚至找不到错误的结果。

首先,让我解释一下这个任务。 它是关于“Yijing Hexagram Symbols”。 左边的是原始的,右边的是我的代码应该给我的结果。 enter image description here 基本上每个“六芒星”都包含6条线,可以分开或不分开。

总共有

2 ^ 6 = 64可能的“hexagrams”

任务是计算和编码方法以打印所有可能的组合。

这就是我到目前为止所拥有的:

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));
        }
    }
}

问题是,当我用'10'测试'show'-methode时,我得到了3行而不是2行。

public class runner {

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

我曾经遇到过的另一个问题是,由于我转换为二进制文件,我有时候没有足够的行,因为例如二进制中的10是0001010,但第一个“0”缺失。如何在不改变的情况下以简单的方式实现它们?

我对这一切都很陌生,所以如果我没有解释任何内容或有任何错误,请随时告诉我。

3 个答案:

答案 0 :(得分:3)

如果您将Integer.toBinaryString方法与String.formatString.replace方法结合使用,您可能会觉得更容易。

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

这会将数字转换为二进制,将其格式化为六个空格的字段(必要时带前导空格),然后用'0'.替换空格

答案 1 :(得分: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)

答案 2 :(得分:2)

好吧,有很多种方法可以用零填充字符串,或者创建一个已用零填充的二进制字符串。

例如,您可以执行以下操作:

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

这会检查你的字符串有多长,并且需要尽可能多的零来从"000000"字符串填充最多6个字符串。

或者你可以简单地用一个专门用于六位数字的转换方法替换你的转换方法(这是递归的,而且这不是必需的):

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',因为这就是字符数组的初始化方式。

实际上有很多方法可以达到同样的效果。