描述假设有N盏灯N为不大于5000的正整数从1到N按顺序依次编号初始时全部处于开启状态;有M个人M为不大于N的正整数也从1到M依次编号。第一个人1号将灯全部关闭第二个人2号将编号为2的倍数的灯打开第三个人3号将编号为3的倍数的灯做相反处理即将打开的灯关闭将关闭的灯打开。依照编号递增顺序以后的人都和3号一样将凡是自己编号倍数的灯做相反处理。请问:当第M个人操作之后哪几盏灯是关闭的按从小到大输出其编号
题目要求根据给定的N和M,模拟M个人对N盏灯的操作,最后输出关闭的灯的编号。
思路如下:
- 创建一个大小为N的bool数组lights,并初始化为true,表示所有灯都是开启状态。
- 使用一个循环,从1到M,依次模拟每个人对灯的操作。
- 在每个人的操作中,使用一个嵌套循环,从当前人的编号开始,每次以当前人的编号为步长,遍历所有灯的编号,并将对应位置的灯状态取反。
- 最后,遍历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,输出关闭的灯的编号
原文地址: https://www.cveoy.top/t/topic/iOz3 著作权归作者所有。请勿转载和采集!