C++ 实现灯泡问题:找出最终关闭的灯泡

问题描述:

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

输入格式 输入为一行,一个整数 N,为灯的数量。

输出格式 输出为一行,按顺序输出关着的灯的编号。编号与编号之间间隔一个空格。

C++ 代码示例:

#include <iostream>
#include <vector>

using namespace std;

vector<int> closedLamps(int N) {
    vector<int> lamps(N + 1, 1); // 初始化所有灯都为开启状态
    for (int i = 2; i <= N; i++) {
        for (int j = i; j <= N; j += i) {
            lamps[j] = 1 - lamps[j]; // 将倍数为i的灯的状态取反
        }
    }
    vector<int> closed;
    for (int i = 1; i <= N; i++) {
        if (lamps[i] == 0) {
            closed.push_back(i);
        }
    }
    return closed;
}

int main() {
    int N;
    cin >> N;
    vector<int> result = closedLamps(N);
    for (int i = 0; i < result.size(); i++) {
        cout << result[i] << " ";
    }
    cout << endl;
    return 0;
}

代码解析:

该程序首先定义了一个名为closedLamps的函数,该函数接受一个整数N作为参数,返回一个vector<int>,表示关闭的灯的编号。在函数中,首先创建了一个长度为N+1的vector,并将所有灯的状态初始化为1(开启)。然后,使用两层循环遍历每个人和每个灯,并根据规则将灯的状态取反。最后,遍历所有灯的状态,将关闭的灯的编号添加到closed向量中。最后,在main函数中,从输入中读取灯的数量N,并调用closedLamps函数获取关闭的灯的编号,并将其输出到标准输出流中。

希望对你有所帮助!

C++ 编程实现灯泡问题:找出最终关闭的灯泡

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

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