/ *有100名学生和100个储物柜。学生1全部打开,学生2每隔一秒钟关闭一次,学生3每隔一秒钟更改一次
储物柜(如果打开则关闭,如果关闭则打开),学生4会为每个100个学生更换每个储物柜,依此类推。
哪个储物柜将保持打开状态? * /

到目前为止,这是我的代码:

#include <stdio.h>

int main(void)
{
int locker[100], i, closed = 0, opened = 0;

for(i=0; i<100; i++) locker[i] = 1;//0 means closed locker, 1 means open locker
for(i=1; i<101; i++) if(i % 2 == 0) locker[i-1] = 0; // every second locker is closed by second student...(2,4,6,7)
for(i=3; i<101; i++){ // i means student no. i
    if(locker[i-1] == 0) locker[i-1] = 1;
    if(locker[i-1] == 1) locker[i-1] = 0;


如果我用“ else”代替“ if(locker [i-1] == 1)”,为什么程序不起作用?正确的结果是打开1关闭了99。如果我使用“ else”,结果打开了50,关闭了50

}
for(i=0; i<100; i++){
    if(locker[i] == 0) closed = closed + 1;
    else opened = opened + 1;
}
printf("opened locker %d\nclosed locker %d", opened, closed);
return 0;


}

这是我在堆栈溢出中的第一篇文章。如果我做错了什么,请纠正我。

最佳答案

我会给您一些提示以帮助您。


答案是有10个储物柜保持打开状态,有90个处于关闭状态。
对于此特定问题,如果避免从零开始的索引编制,则编写代码会更容易。所以
将数组声明为int locker[101];,然后使用索引1至
100代表100个储物柜。
第N个学生应该每N个储物柜都换一次。所以你需要
两个嵌套的for循环。外循环跟踪n,并且
内环翻转储物柜。
仅影响每个第N个储物柜的内部循环应如下所示
这个

for ( i = n; i <= 100; i += n ) // every Nth locker
    locker[i] = 1 - locker[i];  // flip the locker


请注意,我们有i=0而不是普通的i++i=n
i+=n。因此,例如,如果n为3,则i的值
3,6,9,...

10-04 21:53