Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用布尔数组的储物柜拼图_Java_Arrays_Puzzle - Fatal编程技术网

Java 使用布尔数组的储物柜拼图

Java 使用布尔数组的储物柜拼图,java,arrays,puzzle,Java,Arrays,Puzzle,我不想要答案,我想知道我做错了什么。以下是问题 一所学校有100个储物柜和100名学生。开学第一天,所有储物柜都关闭。当学生进入时,第一个学生(表示为S1)打开每个储物柜。然后,第二个学生S2从第二个储物柜开始,表示为L2,并每隔一个储物柜关闭一次。学生S3从第三个储物柜开始,每三个储物柜更换一次(打开时关闭,关闭时打开)。学生S4从储物柜L4开始,每四个储物柜更换一次。学生S5从L5开始,每五个储物柜更换一次,依此类推,直到学生S100更换L100 当所有的学生都经过大楼并更换了储物柜后,哪些

我不想要答案,我想知道我做错了什么。以下是问题

一所学校有100个储物柜和100名学生。开学第一天,所有储物柜都关闭。当学生进入时,第一个学生(表示为S1)打开每个储物柜。然后,第二个学生S2从第二个储物柜开始,表示为L2,并每隔一个储物柜关闭一次。学生S3从第三个储物柜开始,每三个储物柜更换一次(打开时关闭,关闭时打开)。学生S4从储物柜L4开始,每四个储物柜更换一次。学生S5从L5开始,每五个储物柜更换一次,依此类推,直到学生S100更换L100

当所有的学生都经过大楼并更换了储物柜后,哪些储物柜是打开的?写一个程序来找到你的答案。程序应显示答案

我的代码是

public class LockerPuzzle {

    public static void main(String[] args) {
       
        
        boolean[] lockers = new boolean[100];

        // first all the lockers are closed. false represents closed
        for (int i= 0; i<lockers.length;i++){
            lockers[i]= false;
            System.out.println(lockers[i]);
        }

        // then the first student comme and opens all the lockers
        for (int i = 0; i< lockers.length; i++){
           lockers[i] = true;
        }

       
        int locker = 0;
        for(int j = 1; j<= lockers.length; j++){
            for(int k =j; k< lockers.length; k =k+j){
                if(lockers[k] == false){
                    lockers[k]=true;
                }else{
                    lockers[k]= true;
                }

            }
        }

        // this prints all the open lockers.
        for(int S=0; S<lockers.length; S++)
        {
            if (lockers[S] == true) {
                System.out.println("Locker " + S + " Open");
            }

    }
  }
}
public class LockerPuzzle{
公共静态void main(字符串[]args){
布尔值[]储物柜=新布尔值[100];
//首先,所有的储物柜都关上了。false表示关上了
对于(int i=0;i我注意到这个方块:

if(lockers[k] == false){
    lockers[k]=true;
}else{
    lockers[k]= true;
}

这将使lockers[k]无论哪种方式都为true。您只需将其替换为
lockers[k]=!lockers[k]
即可避免此类键入错误。建议您无需编写以下代码

// first all the lockers are closed. false represents closed
for (int i= 0; i<lockers.length;i++){
     lockers[i]= false;
     System.out.println(lockers[i]);
}
//首先所有储物柜都已关闭。false表示已关闭
对于(inti=0;i虽然我同意,但我仍然认为您将受益于一些减少代码大小的一般提示和指导

正如@onkarruikar所指出的,您不必手动初始化
储物柜
表。
new boolean[100]
创建一个数组,其中所有元素都设置为
false

正如@MathiasRaba所提到的,您不需要if/else块来打开/关闭锁,只需将锁设置为相反的值即可

现在让我们考虑锁定和解锁的实际模拟。<代码> I <代码>第1个学生从<代码> I/代码>第15个锁存器开始,然后进入一个锁存器,该代码是“代码> i+1> <代码>元素。

boolean[] lockers = new boolean[100];
for (int i = 0; i < 100; i++) {
    for (int j = i; j < 100; j += i + 1) {
        lockers[j] = !lockers[j];
    }
}
boolean[]储物柜=新的boolean[100];
对于(int i=0;i<100;i++){
对于(int j=i;j<100;j+=i+1){
储物柜[j]=!储物柜[j];
}
}

请注意,为了更好地使用数组索引,学生/储物柜的编号是以零为基础的。

无需从1开始。零索引很好

public class MainClass {

    public static void main(String[] args) {
        
        boolean LockerList [] = new boolean [100];
        
        for (int s=0; s<100; s++)                 // student loop [0..99]
            for (int l=s; l<100; l=l+(s+1))       // locker loop  [0..99]
                LockerList[l] = !LockerList[l];   // toggle value

        // display open-lockers
        for (int x=0; x<100; x++)
            if (LockerList[x] == true)
                System.out.printf("Locker %d is open\n", x+1);
    }
}

// hints: s=5 is the 6th student so he will hop six boxes i.e. s+1
//        And do not display last locker as 99, it should be 100 i.e. x+1
public类MainClass{
公共静态void main(字符串[]args){
布尔LockerList[]=新布尔值[100];

对于(int s=0;如果当前输出与所需输出不匹配,并且您不知道为什么,那么现在是开始调试的时候了。如果您不确定如何进行调试,请检查。它不会解决您的直接问题,但它将为您提供可供遵循的步骤,这些步骤将有助于您自己解决问题,或者即使不成功也可以essful,那么至少可以帮助你更好地隔离你的问题,这样你的问题就可以更集中,更容易回答。你应该总是从
int k=j-1
开始。虽然这是真的,但这并不能以任何方式回答问题。作者问
我想知道我做错了什么。
所以给他建议。但这是真的没有错,这是低效的,不需要,但也没有错。额外的知识应该没有坏处。谢谢你,但你能解释一下为什么我们应该给我加1吗,请首先,我已经把学生和锁从:
S1-S100,L1-L100
S0-S99,L0-L99
。请注意,外部循环从
I=0
开始。如果我想要内部循环循环前进,我不能这样做:
j+=0
。因此我添加了1来说明这一点,一切都正常。@Vardhanpetel注意,这样你就不再需要在这个循环之外的任何手动初始化循环。不需要初始的真/假设置,每个储物柜的默认值false/closed是正确的,这个循环现在覆盖了所有学生它即将到来,包括第一个将每个储物柜从关闭状态切换为打开状态的储物柜。