如何解决Java学生和储物柜问题?[已关闭]

xwbd5t1u  于 2023-01-11  发布在  Java
关注(0)|答案(2)|浏览(188)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

18小时前关门了。
Improve this question
这是我的一次测验中的一道题,不知怎么的,我想不出该如何解答。
一间教室有10个储物柜和10名学生。所有储物柜在开学第一天都是关闭的。当学生们进入教室时,第一个学生(表示为S1)打开每个储物柜。然后第二个学生(S2)从第二个储物柜(表示为L2)开始,每隔一个储物柜就关闭一次。学生S3从第三个储物柜开始,每隔三个储物柜就更换一次(如果它是打开的,则关闭它,如果它是关闭的,则打开它)。学生S4从储物柜L4开始,并且每四个储物柜更换一次。学生S5从储物柜L5开始,并且每五个储物柜更换一次,以此类推,直到学生S10更换储物柜L10。在所有学生通过更衣室并且更换储物柜之后,哪个储物柜是开着的?2编写一个程序来查找答案。3程序应该显示如下的答案:
储物柜x打开
储物柜是开着的
...
储物柜z打开了
(x,y z为储物柜编号)
有人知道怎么解决吗?
我试过了,但我不知道这样做对不对。

public class Question1 {
    public static void main(String[] args) {
    // Initialize all lockers to closed
    boolean[] lockers = new boolean[10];
    for (int i = 0; i < lockers.length; i++) {
      lockers[i] = false;
    }

    // Loop through each student
    for (int student = 1; student <= lockers.length; student++) {
      // Loop through each locker
      for (int l = student - 1; l < lockers.length; l += student) {
        // Toggle the state of the locker
        lockers[l] = !lockers[l];
      }
    }

    // Print the final state of the lockers
    for (int i = 0; i < lockers.length; i++) {
      System.out.println("Locker " + (i + 1) + " is " + (lockers[i] ? "open" : "closed"));
    }
  }
    
}

下面是输出

Locker 1 is open
Locker 2 is closed
Locker 3 is closed
Locker 4 is open
Locker 5 is closed
Locker 6 is closed
Locker 7 is closed
Locker 8 is closed
Locker 9 is open
Locker 10 is closed
kse8i1jr

kse8i1jr1#

TL:DR您的答案正确。这是您评估问题的方式

每个学生***s(i)***从locker***l(j)***开始。然后,每个学生 sj 等于 i 开始切换locker l 的状态,跳过 i 个locker。例如,学生 s(3) 从locker l(3) 开始,然后每3个locker切换一次:l(3)、l(6)、l(9)...... l(j+=i)。
我认为这个问题强调的主要技巧是嵌套循环和循环计数器。
首先把问题写在纸上会有帮助,尤其是当涉及到复杂的迭代时,你不必绝对地把每一次迭代都写在纸上,但要写足够多的迭代,这样你就可以看到模式。
在这种情况下,当打印出locker数组的值时,index n 左边的每一个位置都应该保持不变。下面是一个如何在纸上解决这个问题的例子。
初始状态

0 0 0 0 0 0 0 0 0 0

学生1(打开每个储物柜)
学生2(从储物柜2开始,每隔一个储物柜进行切换)
学生3(从储物柜3开始,每隔3个储物柜切换一次)
学生4(从4号储物柜开始,每隔4个储物柜切换一次)
学生5(从5号储物柜开始,每隔5个储物柜切换一次)
学生6(从6号储物柜开始,每隔6个储物柜切换一次)
学生7(从7号储物柜开始,每隔7个储物柜切换一次)
学生8(从储物柜8开始,每隔8个储物柜切换一次)
学生9(从储物柜9开始,每隔9个储物柜切换一次)
学生10(从储物柜10开始,每隔10个储物柜切换一次)
或者,您可以在每次迭代后排列值或数组

0 0 0 0 0 0 0 0 0 0 - Initial 
1 1 1 1 1 1 1 1 1 1 - s1
1 0 1 0 1 0 1 0 1 0 - s2
1 0 0 0 1 1 1 0 0 0 - s3
1 0 0 1 1 1 1 1 0 0 - s4
1 0 0 1 0 1 1 1 0 1 - s5
1 0 0 1 0 0 1 1 0 1 - s6
1 0 0 1 0 0 0 1 0 1 - s7
1 0 0 1 0 0 0 0 0 1 - s8
1 0 0 1 0 0 0 0 1 1 - s9
1 0 0 1 0 0 0 0 1 0 - s10

因为您的算法从索引 n 开始更改,所以没有学生可以翻转前一个学生的初始索引的状态(即,学生2不能翻转索引0,这是学生1翻转的第一个储物柜)。
在纸上做这个的另一个好处是,你在每次迭代后都有数组的值,所以,当你运行调试时,你可以看到中间值,你可以用它来比较当前值和期望值,如果它们匹配,你就在正确的轨道上了。
现在,最坏的情况是,你的假设可能是错误的。然而,总是错误总比总是不正确好。这意味着,即使你的解决方案是不正确的,它是由于一个不正确的假设,而不是因为你的逻辑不一致。

ogq8wdun

ogq8wdun2#

在您的示例中,输出与解释一致,因为1号、4号和9号储物柜是打开的,而其余的储物柜是关闭的。因此,您的解决方案是正确的,应该按预期工作。

相关问题