开灯问题的编程代码可以通过以下步骤实现:
初始化灯的状态 :将所有灯的状态初始化为打开(通常用1表示)。模拟每个人的操作:
对于每个人,遍历所有的灯,如果灯的编号是该人的编号的倍数,则切换灯的状态(即1变为0,0变为1)。
输出结果:
遍历所有的灯,输出状态为1的灯的编号。
```c
include include define MAXN 1000 int main() { int n, k; scanf("%d %d", &n, &k); // 初始化所有灯为打开状态 int lights[MAXN] = {1}; // 模拟每个人的操作 for (int i = 1; i <= k; i++) { for (int j = i; j <= n; j += i) { lights[j] = 1 - lights[j]; // 切换灯的状态 } } // 输出结果 for (int i = 1; i <= n; i++) { if (lights[i]) { printf("%d ", i); } } printf("\n"); return 0; } ``` 代码解释: 初始化 ```c int lights[MAXN] = {1}; ``` 这行代码将所有灯的状态初始化为1,表示所有灯都是打开的。 ```c for (int i = 1; i <= k; i++) { for (int j = i; j <= n; j += i) { lights[j] = 1 - lights[j]; } } ``` 这个嵌套循环遍历每个灯,如果灯的编号是当前循环变量`i`的倍数,则切换该灯的状态。 ```c for (int i = 1; i <= n; i++) { if (lights[i]) { printf("%d ", i); } } printf("\n"); ``` 这个循环遍历所有灯,输出状态为1的灯的编号。 示例输入输出: 输入:`7 3` 输出:`1 5 6 7` 这个代码可以处理最多1000盏灯和最多1000次操作,满足题目要求。模拟操作
输出结果