酷代码 AI
菜单

题目描述 假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。 第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。 请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。 输入格式 输入正整数N和M,以单个空格隔开。 输出格式 顺次输出关闭的灯的编号,其间用逗号间隔。 输入样例 10 10 输出样例 1,4,9 说明/提示 用c++语言,简单

```cpp #include <iostream> using namespace std; int main() { int N, M; // 读取输入的N和M cin >> N >> M; // 定义一个布尔数组来表示灯的状态,初始全部为打开(true) bool lights[5001] = {true}; for (int i = 1; i <= N; i++) { lights[i] = true; } // 模拟每个人对灯的操作 for (int person = 1; person <= M; person++) { for (int light = person; light <= N; light += person) { // 对编号为person倍数的灯做相反处理 lights[light] =!lights[light]; } } // 标记是否是第一个输出的编号 bool first = true; // 输出关闭的灯的编号 for (int i = 1; i <= N; i++) { if (!lights[i]) { if (!first) { cout << ","; } cout << i; first = false; } } return 0; } ``` 代码解释: 1. 输入读取:使用`cin`读取输入的`N`和`M`,分别表示灯的数量和人的数量。 2. 灯状态初始化:定义一个布尔数组`lights`来表示灯的状态,初始时所有灯都处于打开状态(`true`)。 3. 模拟操作:通过两层循环模拟每个人对灯的操作。外层循环遍历每个人,内层循环遍历该人编号倍数的灯,并将其状态取反。 4. 输出结果:遍历所有灯,将关闭的灯的编号输出,编号之间用逗号分隔。使用`first`变量来标记是否是第一个输出的编号,避免在第一个编号前输出逗号。 [2025-11-24 13:49:37 | AI问答 | 441点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多