学生储物柜拼图

时间:2016-06-23 17:27:49

标签: c puzzle

/ *有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;  

如果我替换&#34; if(locker [i-1] == 1)&#34;用&#34;否则&#34;为什么该计划不起作用?正确的结果打开1关闭99.如果我使用&#39;否则&#39;结果将打开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;

}

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

5 个答案:

答案 0 :(得分:1)

我会给你一些提示来帮助你。

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

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

    请注意,我们i=0代替普通i++i=ni+=n。因此,例如,如果n为3,那么i的值 是3,6,9,...

答案 1 :(得分:0)

虽然我没有检查整个代码,但问题的逻辑对我来说不是很清楚,但这些代码在您的代码中似乎有问题:

if(locker[i-1] == 0) locker[i-1] = 1;
if(locker[i-1] == 1) locker[i-1] = 0; 

你在这里做的是,如果值为0,那么你将其设置为1,然后再次检查,如果是1,则将其设置为0.所以,在这种情况下在运行这两个语句之后,所有值都将设置为0。

相反,你应该做

if(locker[i-1] == 0) locker[i-1] = 1;
else locker[i-1] = 0; 

答案 2 :(得分:0)

请注意,你的循环是错误的,因为你是为第三个学生循环遍历每个储物柜而不是循环其余的。您应该为每个学生(n)更换每个第n个储物柜。

当你连续两个ifs时。如果第一个打开一个储物柜,第二个如果看到它打开并关闭它(这是错误的)。其他人需要实际改变它。

另一点是你可以使用独占或代替if locker[i] ^= 1

#include <stdio.h>

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

for(i=0; i<100; i++) {
  if (i%2 == 0) locker[i] = 1; // odd lockers (base 1) stay open
  else locker[i] = 0; // even lockers (base 1) are closed
  //0 means closed locker, 1 means open locker
  for(i=3; i<101; i++){ // i means student no. i
    for (k=i; k<101); k+=i) { // change every ith locker
      // if (locker[k-1] == 0) locker[k-1]=1
      // else locker[i-1] = 0;
      // use exclusive or instead of if
      locker[i-1] ^= 1;
    }
   }
}
// Now check the number open or closed
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;

}

答案 3 :(得分:0)

LOCKERS是新的FIZZBUZZ。

您已经对这个问题有了很好的答案。这是一个使用布尔值的短程序。

 /* lockers.c

   There are 100 students and 100 lockers. Student 1 opens all, student 2
   closes every second one, student 3 changes every third locker (closes if
   open, opens if close), Student 4 changes every forth locker and so on for
   all 100 students. Which lockers will be open at the end of the process?
*/

#include <stdio.h>
#include <stdbool.h>

int main (void)
{
    int i, j;
    bool locker[101];           // locker open = true, locker closed = false

    // student 1 opens all lockers

    for ( i = 1; i <= 100; ++i )
        locker[i] = true;

    // subsequent students toggle subsequent lockers

    for ( i = 2; i <= 100; ++i ) 
        for ( j = i; j <= 100; j += i )
            locker[j] = ! locker[j];

    // display results

    printf ("\nopen lockers: ");

    for ( i = 1; i <= 100; ++i )
        if ( locker[i] )
            printf ("%i ", i);

    printf ("\n");

    return 0;
}   

开放式储物柜是完美正方形的数字 - 任何具有奇数因子的数字都是完美的正方形。

答案 4 :(得分:0)

解决方案,不使用数组。

#include <iostream>

using namespace std;

int main()
{

int studentTotal , lockerTotal,  visit, totalOpened = 0, totalClosed = 0;


cout << "Enter number of students" << endl;
cin >> studentTotal;



lockerTotal = studentTotal;

    for (int locker = 1; locker <= lockerTotal;  locker++ ){ // locker loop
        cout << "\n\n\nLocker no." << locker << endl;
        cout << " is visited by student(s) ";
        visit = 0;
        for (int student = 1 ; student <= studentTotal; student++) { // student loop

        if( locker % student == 0) {
                cout << student << ", ";
                visit++;}

        }//end of locker loop

        cout << "\nTotal number of visits: " << visit;
        if (visit % 2 == 0){
            cout << " the locker will stay closed.";
            totalClosed++;}
        else { cout << " the locker will be opened.";
            totalOpened++;}

    } //end of student loop

    if (lockerTotal == totalOpened + totalClosed) {
        cout << "\n\n\nOf total lockers (" << lockerTotal << "), " << totalOpened << " will be left open." << "(" << totalClosed << ") " << "will be closed." << endl;
        }else cout << "Error!!";



    return 0;

}