这是我们被分配的问题:
九个硬币放置在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]);
}
}
}
答案 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.replace
将0
替换为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());
如果我们需要一些正则表达式向导(发现here和here),我们可以做得更好:
H H H
H T H
T T T
将所有内容放在一起,我们得到:
for(String sl : s3.split("(?<=\\G.{3})"))
System.out.println(sl.replaceAll(".(?=.)", "$0 "));