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

问题描述

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

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

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

我的代码

mlogit

我的输出是说所有储物柜都打开了。

解决方法

我注意到了这个块:

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

无论哪种方式都会将储物柜[k]设置为真。您只需将其替换为 lockers[k] = !lockers[k] 即可避免此类拼写错误。

,

虽然我同意 this comment,但我仍然认为您会受益于一些可以减少代码大小的一般提示和说明。

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

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

现在让我们考虑锁定和解锁的实际模拟。第 i 个学生从第 i 个储物柜开始,然后继续到距离 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];
    }
}

请注意,学生/储物柜的编号从零开始,以便更好地使用数组索引。

,

无需从 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
,

只是一个建议,您不必编写以下代码。

// 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