开灯问题

个人学习笔记,有错误或者建议欢迎指出。

/*开灯问题

  有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关闭),

  第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),以此类推。一共有

  k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k<=n<=1000

*/

//#define LOCAL

#include

#define max_n 1000

int main()

{

//输入输出重定向,方便读入测试文档

#ifdef LOCAL

FILE* stream1;

freopen_s(&stream1, "data.in", "r", stdin);

freopen_s(&stream1, "data.out", "w", stdout);

#endif

int n, k, a[max_n];

//读入数据直到没有数据

while (scanf_s("%d %d", &n, &k) != EOF)

{

//将n盏灯全部置0,即关闭

for (int i = 0; i < n; i++)

{

a[i] = 0;

}

//循环k个人

for (int i = 1; i <= k; i++)

{

//循环n盏灯

for (int j = 1; j <= n; j++)

{

//如果第j盏灯恰好是第j个人的倍数,则灯的状态改变

if (j % i == 0)

{

if (a[j - 1] == 0)

a[j - 1] = 1;

else

a[j - 1] = 0;

}

}

}

for (int i = 0; i < n; i++)

{

if (a[i] == 1)

printf("%d ", i + 1);

}

printf("\n");

}

return 0;

}

你可能感兴趣的:(开灯问题)