/ *有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;
}
这是我在堆栈溢出中的第一篇文章。如果我做错了,请纠正我。
答案 0 :(得分:1)
我会给你一些提示来帮助你。
int locker[101];
,然后使用索引1到
100代表100个储物柜。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=n
和i+=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;
}