我的逻辑缺陷 - Java

时间:2016-03-10 09:41:26

标签: java logic

我必须编写一个程序,使用数组代表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

某处我的逻辑存在缺陷,因为最终的结果应该是每个更衣室号码,一个完美的方块被打开,其余的都被关闭。我哪里出错了?我的朋友说了一些关于为储物柜使用布尔值的事情,但我不知道这会如何改变结果

3 个答案:

答案 0 :(得分:2)

您应该注意以下几点:

  1. 您用于储物柜阵列的索引是错误的索引和主要错误。
  2. 你的朋友说,你应该使用布尔来标记状态;结果将是相同的,但代码将更清晰,内存占用更小(从101 int值到101 boolean)。
  3. 您可以使用0到99之间的数组,但是您需要更正用于数组的索引。如果你只是不使用&#34; 0&#34;索引你可以像现在这样离开它,为了便于理解,我保留了你的索引。
  4. 您应该使用输出格式化方法将索引与值对齐。
  5. 您没有使用学生数组,只使用学生数,因此您可以从代码中删除它并仅引入变量或常量,您将节省内存空间(从10个int值到1)。
  6. 您的代码更正如下:

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

    我希望能帮助你。

答案 1 :(得分:1)

一个错误 - 在您的内循环中,您更改了lockers[i]而不是lockers[j]

但为什么不让内部for循环只包含特定数字3, 6, 9...?它会使代码更简单,例如。

 for (int j = i; j < lockers.length; j += i) {
     lockers[j] *= -1;
 }

答案 2 :(得分:0)

在打开和关闭储物柜的方法中:

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;