题目描述: 一间教室里有n盏灯,编号从1-n,开始时全部是关闭状态, 现在有m个人进入教室,第1个人把所有灯打开, 第2个人只按下所有编号为2的倍数的开关(此时,这些灯会关闭), 第三个人按下所有编号为3的倍数的开关(此时,关闭状态的灯会打开,打开状态的灯会关闭)。 依次类推,直到所有人进入,请问最后有那些编号的灯开着。 输入描述: 输入两个整数n和m,其中m<=n<=100。 输出描述: 输出最后开着灯的编号 输入样例: 7 5 输出样例: 1 4 6 7
#include<stdio.h>
int main(int argc, char* argv[]) {
int lit[100] = { 0 }, num[100] = { 0 }, m, n;
scanf("%d%d", &n, &m);
for (int i = 1; i < n + 1; ++i)
lit[i] = 1; //1为开,0为关,初始全部为开
for (int i = 1; i < m + 1; ++i)
num[i] = i; //对人员进行编号,依次为1、2、3、……
for (int i = 2; i < m + 1; ++i)
for (int j = 1; i * j < n + 1; ++j) {
if (lit[i * j] == 1)
lit[i * j] = 0;
else
lit[i * j] = 1;
}
for (int i = 1; i < n + 1; ++i)
if (lit[i] == 1)
printf("%d ", i);
return 0;
}