题目要求根据给定的N和M,模拟M个人对N盏灯的操作,最后输出关闭的灯的编号。

思路如下:

  1. 创建一个大小为N的bool数组lights,并初始化为true,表示所有灯都是开启状态。
  2. 使用一个循环,从1到M,依次模拟每个人对灯的操作。
  3. 在每个人的操作中,使用一个嵌套循环,从当前人的编号开始,每次以当前人的编号为步长,遍历所有灯的编号,并将对应位置的灯状态取反。
  4. 最后,遍历lights数组,输出状态为false的灯的编号。

代码如下:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;

    vector<bool> lights(N+1, true);

    for (int i = 1; i <= M; i++) {
        for (int j = i; j <= N; j += i) {
            lights[j] = !lights[j];
        }
    }

    bool first = true;
    for (int i = 1; i <= N; i++) {
        if (!lights[i]) {
            if (!first) {
                cout << ",";
            }
            cout << i;
            first = false;
        }
    }

    cout << endl;

    return 0;
}

这样就可以根据给定的N和M,输出关闭的灯的编号

描述假设有N盏灯N为不大于5000的正整数从1到N按顺序依次编号初始时全部处于开启状态;有M个人M为不大于N的正整数也从1到M依次编号。第一个人1号将灯全部关闭第二个人2号将编号为2的倍数的灯打开第三个人3号将编号为3的倍数的灯做相反处理即将打开的灯关闭将关闭的灯打开。依照编号递增顺序以后的人都和3号一样将凡是自己编号倍数的灯做相反处理。请问:当第M个人操作之后哪几盏灯是关闭的按从小到大输出其编号

原文地址: https://www.cveoy.top/t/topic/iOz3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录