个人学习笔记,有错误或者建议欢迎指出。
/*开灯问题
有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关闭),
第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),以此类推。一共有
k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k<=n<=1000
*/
//#define LOCAL
#include <stdio.h>
#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;
}
网友评论