【问题标题】:Having trouble filling an array of binary numbers from an integer从整数填充二进制数数组时遇到问题
【发布时间】:2018-09-16 18:57:21
【问题描述】:

这是我们被分配的问题:

九个硬币被放置在一个 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]);

    } 

}
}

【问题讨论】:

  • 在toBinary函数i的while循环内部没有改变。
  • 我没有运行您的代码,但您似乎打印了 9 次相同的结果。 for (int i = 0; i &lt; 9; i++) { printArr(binaryNumbers); ... }

标签: java arrays methods computer-science


【解决方案1】:

看起来您在 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;

最后,我认为你的数组在你完成后可能会倒退,所以你可能需要反转它或以相反的顺序输出它

【讨论】:

    【解决方案2】:

    我意识到这是一项家庭作业,因此您应该坚持当前的方法。但是,有时看看使用 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
    

    如果我们想要一些正则表达式魔法(找到here 和here),我们可以做得更好:

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

    【讨论】:

    • 有趣...你能解释一下 Integer.toBinaryString(1
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    相关资源
    最近更新 更多