我的逻辑有问题 - 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;

你应该注意一些事情:

  1. 您为储物柜数组使用的索引错误,这是您的主要错误。
  2. 你应该用布尔值来标记状态,就像你朋友说的那样;结果是一样的,但代码会更清晰,内存占用更小(从 101 个 int 值到 101 个 boolean)。
  3. 您可以使用从 0 到 99 的数组,但您需要更正用于数组的索引。如果你只是不使用“0”索引,你可以像现在一样保留它,为了易于理解,我保留了你的索引。
  4. 您应该对输出使用一种格式化方法,使索引与值对齐。
  5. 你没有使用学生数组,只使用了学生的数量,所以你可以从你的代码中删除它并只引入一个变量或常量,你将节省内存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"));
        }
    }
}

希望对你有帮助。