c语言假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。 第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。 请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
时间: 2023-12-03 18:42:41 浏览: 283
这道题可以用一个数组来记录每盏灯的状态,如果是关闭状态就用0表示,如果是开启状态就用1表示。然后按照题意模拟每个人的操作即可。
具体实现可以参考下面的代码:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
int *lights = (int *) malloc((n + 1) * sizeof(int));
for (int i = 1; i <= n; i++) {
lights[i] = 1; // 初始时全部处于开启状态
}
for (int i = 1; i <= m; i++) {
for (int j = i; j <= n; j += i) {
lights[j] = !lights[j]; // 将凡是自己编号倍数的灯做相反处理
}
}
int first = 1;
for (int i = 1; i <= n; i++) {
if (lights[i] == 0) { // 输出关闭的灯的编号
if (!first) {
printf(",");
}
printf("%d", i);
first = 0;
}
}
printf("\n");
free(lights);
return 0;
}
```
其中,我们使用了动态内存分配来创建一个数组 `lights` 来记录每盏灯的状态。注意,数组的大小应该是 `n+1`,因为题目中的灯的编号是从1开始的。
最后,我们遍历 `lights` 数组,找出所有关闭的灯的编号,并按照题目要求输出即可。
阅读全文