酷代码 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+语言

以下是使用 C++ 语言解决该问题的代码: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int N, M; // 读取输入的 N 和 M cin >> N >> M; // 创建一个布尔类型的向量来表示灯的状态,初始都为开启状态(true) vector<bool> lights(N + 1, 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; } } cout << endl; return 0; } ``` 代码解释: 1. 输入读取:使用 `cin` 读取输入的 `N` 和 `M`,分别表示灯的数量和人的数量。 2. 灯状态初始化:使用 `vector<bool>` 来表示灯的状态,初始时所有灯都处于开启状态(`true`)。 3. 模拟操作:通过两层循环模拟每个人对灯的操作。外层循环遍历每个人,内层循环遍历所有编号为当前人编号倍数的灯,并将其状态取反。 4. 输出结果:遍历所有灯,找出关闭的灯并输出其编号,使用逗号分隔。 复杂度分析: - 时间复杂度:$O(M * N)$,其中 $M$ 是人的数量,$N$ 是灯的数量。 - 空间复杂度:$O(N)$,主要用于存储灯的状态。 [2025-11-24 13:28:29 | AI问答 | 486点数解答]

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