无法从整数填充二进制数字数组

时间:2018-09-16 18:57:22

标签: java arrays methods computer-science

这是我们被分配的问题:

九个硬币放置在3x3矩阵中,有些面朝上,有些面朝下。您可以使用值为0(正面)和1(尾部)的3x3矩阵表示硬币的状态。以下是一些示例:

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 :(得分:4)

好像您在while循环中增加了错误的变量:

while (inputtedNumber > 0) { 

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

} return binaryNum;

还请注意,new int[9]可能已经初始化为 0 ,但如果没有初始化,则可以循环9次,而不要等到{{ 1}}是 0

inputtedNumber

最后,我认为完成后您的数组可能会向后,因此您可能需要反转或以相反顺序输出

答案 1 :(得分:0)

我意识到这是一项家庭作业,因此您应该坚持使用当前的方法。但是,有时看到使用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.replace0替换为H,将1替换为{ {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());

如果我们需要一些正则表达式向导(发现herehere),我们可以做得更好:

H H H
H T H
T T T

将所有内容放在一起,我们得到:

    for(String sl : s3.split("(?<=\\G.{3})"))
        System.out.println(sl.replaceAll(".(?=.)", "$0 "));