我的逻辑有问题 - Java
Flaw in my logic - Java
我必须编写一个程序,使用数组来表示 100 个学生打开或关闭 100 个储物柜。从学生 1 开始,如果学生编号是储物柜编号的一个因素,则每个学生都必须更改储物柜位置(即如果关闭则打开,如果打开则关闭)。例如学生 3 会改变储物柜 3、6、9 等的位置...
public class LockerFun {
public static void main (String[] args) {
int[] lockers = new int[101];
int[] students = new int[101];
for (int i = 1; i < lockers.length; i++) {
lockers[i] = 1;
}
for (int i = 1; i < students.length; i++) {
System.out.print( i + " ");
for (int j = 1; j < lockers.length; j++) {
if (j % i == 0) {
lockers[i] *= -1;
}
}
}
System.out.println();
for (int i = 1; i < lockers.length; i++) {
if (lockers[i] == -1) {
System.out.print( "O ");
}
else {
System.out.print( "X ");
}
}
}
}
// 1 = closed, -1 = open
我的逻辑在某处存在缺陷,因为最终结果应该是每个完美正方形的储物柜号码都被打开,其余的都被关闭。我哪里出错了?我的朋友说了一些关于对储物柜使用布尔值的事情,但我不知道这会如何改变结果
一个错误 - 在你的内部循环中,你更改了 lockers[i]
而不是 lockers[j]
但是为什么不让内部 for
只循环特定的数字 3, 6, 9...
?它将使代码更简单,例如
for (int j = i; j < lockers.length; j += i) {
lockers[j] *= -1;
}
在您打开和关闭储物柜的方法中:
for (int i = 1; i < students.length; i++) {
System.out.print( i + " ");
for (int j = 1; j < lockers.length; j++) {
if (j % i == 0) {
lockers[i] *= -1;
}
}
}
这一行需要引用储物柜索引,而不是学生,即
lockers[j] *= -1;
你应该注意一些事情:
- 您为储物柜数组使用的索引错误,这是您的主要错误。
- 你应该用布尔值来标记状态,就像你朋友说的那样;结果是一样的,但代码会更清晰,内存占用更小(从 101 个 int 值到 101 个 boolean)。
- 您可以使用从 0 到 99 的数组,但您需要更正用于数组的索引。如果你只是不使用“0”索引,你可以像现在一样保留它,为了易于理解,我保留了你的索引。
- 您应该对输出使用一种格式化方法,使索引与值对齐。
- 你没有使用学生数组,只使用了学生的数量,所以你可以从你的代码中删除它并只引入一个变量或常量,你将节省内存space(从 10 个 int 值到1).
您更正的代码如下:
public class LockerFun {
public static void main(String[] args) {
final int numberOfStudents = 100;
boolean[] lockers = new boolean[101];
for (int i = 1; i < lockers.length; i++)
lockers[i] = true;
for (int i = 1; i <= numberOfStudents; i++) {
System.out.print(String.format("%4d", i));
for (int j = 1; j < lockers.length; j++) {
if (j % i == 0) {
lockers[j] = !lockers[j];
}
}
}
System.out.println();
for (int i = 1; i < lockers.length; i++) {
if (lockers[i])
System.out.print(String.format("%4s", "X"));
else
System.out.print(String.format("%4s", "O"));
}
}
}
希望对你有帮助。
我必须编写一个程序,使用数组来表示 100 个学生打开或关闭 100 个储物柜。从学生 1 开始,如果学生编号是储物柜编号的一个因素,则每个学生都必须更改储物柜位置(即如果关闭则打开,如果打开则关闭)。例如学生 3 会改变储物柜 3、6、9 等的位置...
public class LockerFun {
public static void main (String[] args) {
int[] lockers = new int[101];
int[] students = new int[101];
for (int i = 1; i < lockers.length; i++) {
lockers[i] = 1;
}
for (int i = 1; i < students.length; i++) {
System.out.print( i + " ");
for (int j = 1; j < lockers.length; j++) {
if (j % i == 0) {
lockers[i] *= -1;
}
}
}
System.out.println();
for (int i = 1; i < lockers.length; i++) {
if (lockers[i] == -1) {
System.out.print( "O ");
}
else {
System.out.print( "X ");
}
}
}
}
// 1 = closed, -1 = open
我的逻辑在某处存在缺陷,因为最终结果应该是每个完美正方形的储物柜号码都被打开,其余的都被关闭。我哪里出错了?我的朋友说了一些关于对储物柜使用布尔值的事情,但我不知道这会如何改变结果
一个错误 - 在你的内部循环中,你更改了 lockers[i]
而不是 lockers[j]
但是为什么不让内部 for
只循环特定的数字 3, 6, 9...
?它将使代码更简单,例如
for (int j = i; j < lockers.length; j += i) {
lockers[j] *= -1;
}
在您打开和关闭储物柜的方法中:
for (int i = 1; i < students.length; i++) {
System.out.print( i + " ");
for (int j = 1; j < lockers.length; j++) {
if (j % i == 0) {
lockers[i] *= -1;
}
}
}
这一行需要引用储物柜索引,而不是学生,即
lockers[j] *= -1;
你应该注意一些事情:
- 您为储物柜数组使用的索引错误,这是您的主要错误。
- 你应该用布尔值来标记状态,就像你朋友说的那样;结果是一样的,但代码会更清晰,内存占用更小(从 101 个 int 值到 101 个 boolean)。
- 您可以使用从 0 到 99 的数组,但您需要更正用于数组的索引。如果你只是不使用“0”索引,你可以像现在一样保留它,为了易于理解,我保留了你的索引。
- 您应该对输出使用一种格式化方法,使索引与值对齐。
- 你没有使用学生数组,只使用了学生的数量,所以你可以从你的代码中删除它并只引入一个变量或常量,你将节省内存space(从 10 个 int 值到1).
您更正的代码如下:
public class LockerFun {
public static void main(String[] args) {
final int numberOfStudents = 100;
boolean[] lockers = new boolean[101];
for (int i = 1; i < lockers.length; i++)
lockers[i] = true;
for (int i = 1; i <= numberOfStudents; i++) {
System.out.print(String.format("%4d", i));
for (int j = 1; j < lockers.length; j++) {
if (j % i == 0) {
lockers[j] = !lockers[j];
}
}
}
System.out.println();
for (int i = 1; i < lockers.length; i++) {
if (lockers[i])
System.out.print(String.format("%4s", "X"));
else
System.out.print(String.format("%4s", "O"));
}
}
}
希望对你有帮助。