当前位置:首页题目 > 正文

c++开关灯问题(少儿编程开关灯)

作者:野牛程序员:2023-06-13 10:48:24题目阅读 2602

题目

有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),

第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,

问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k≤n≤1000。

样例输入:

7 3

样例输出:

1 5 6 7

#include <iostream>

using namespace std;

const int MAX_N = 1000; // 最大灯的数量

void findLights(int n, int k, bool lights[]) {
    for (int i = 0; i < n; i++) { // 初始化所有灯为关闭状态
        lights[i] = false;
    }

    for (int i = 1; i <= k; i++) { // 模拟每个人按灯开关
        for (int j = i - 1; j < n; j += i) { // 根据当前人的编号,按倍数查找灯的编号
            lights[j] = !lights[j]; // 改变灯的状态
        }
    }
}

int main() {
    int n, k;
//   "请输入灯的数量n:入第k个人的编号k:";
    cin >>n>>k;
    

    bool lights[MAX_N]; // 定义静态数组

    findLights(n, k, lights);

//    cout << "开着的灯的编号为:";
    for (int i = 0; i < n; i++) {
        if (lights[i]) { // 灯的状态为开
            cout << (i + 1) << " "; // 输出灯的编号(编号从1开始)
        }
    }
    cout << endl;

    return 0;
}

我们使用了一个大小为MAX_N的静态布尔数组lights,其中MAX_N的值为1000,作为灯的数量的最大值。

findLights函数中,我们仍然使用一个布尔数组lights来表示灯的状态,并进行相同的操作来找出开着的灯的编号。

在主函数中,我们定义了一个静态布尔数组lights[MAX_N]来存储灯的状态。注意,静态数组的大小在编译时就确定了,所以需要确保MAX_N足够大以容纳输入的灯的数量。

方法二:

#include <iostream>

using namespace std;

void findLights(int n, int k, bool lights[]) {
    for (int i = 0; i < n; i++) { // 初始化所有灯为关闭状态
        lights[i] = false;
    }

    for (int i = 1; i <= k; i++) { // 模拟每个人按灯开关
        for (int j = i - 1; j < n; j += i) { // 根据当前人的编号,按倍数查找灯的编号
            lights[j] = !lights[j]; // 改变灯的状态
        }
    }
}

int main() {
    int n, k;
//     "请输入灯的数量n:请输入第k个人的编号k:";
    cin >> n>>k;  
    

    bool* lights = new bool[n]; // 动态分配一个大小为n的布尔数组
    findLights(n, k, lights);

    
    for (int i = 0; i < n; i++) {
        if (lights[i]) { // 灯的状态为开
            cout << (i + 1) << " "; // 输出灯的编号(编号从1开始)
        }
    }
    cout << endl;

    delete[] lights; // 释放动态分配的数组内存

    return 0;
}

我们使用动态分配的布尔数组lights来替代向量。通过new关键字在堆上动态分配了一个大小为n的布尔数组。

findLights函数的修改也很简单,它接受一个额外的参数lights,即灯的状态数组。在函数内部,我们使用lights[i]来访问和改变灯的状态。

最后,在主函数中,我们使用new创建了布尔数组lights,并在使用后使用delete[]释放了动态分配的内存。

请注意,在使用动态分配的数组后,需要使用delete[]释放内存,以避免内存泄漏。


方法三

#include <iostream>
#include <vector>

using namespace std;

vector<int> findLights(int n, int k) {
    vector<bool> lights(n, false); // 用于记录灯的状态,初始全部关闭
    for (int i = 1; i <= k; i++) { // 模拟每个人按灯开关
        for (int j = i - 1; j < n; j += i) { // 根据当前人的编号,按倍数查找灯的编号
            lights[j] = !lights[j]; // 改变灯的状态
        }
    }

    vector<int> result; // 用于记录开着的灯的编号
    for (int i = 0; i < n; i++) {
        if (lights[i]) { // 灯的状态为开
            result.push_back(i + 1); // 记录灯的编号(编号从1开始)
        }
    }

    return result;
}

int main() {
    int n, k;
//    "请输入灯的数量n:请输入第k个人的编号k:";
    cin >> n>> k;
    

    vector<int> openLights = findLights(n, k);

    
    for (int i = 0; i < openLights.size(); i++) {
        cout << openLights[i] << " ";
    }
    cout << endl;

    return 0;
}

在上述代码中,findLights函数接受两个参数:n表示灯的数量,k表示第k个人的编号。它首先创建一个长度为n的bool类型的向量lights,并将所有的元素初始化为false,表示所有灯都是关闭的。

然后,使用嵌套循环模拟每个人按灯开关的过程。外层循环从1到k,内层循环按照当前人的编号i,以i的倍数递增查找灯的编号,并改变相应灯的状态。

最后,遍历所有灯的状态,将开着的灯的编号记录在result向量中,并返回该向量。

在主函数中,首先从用户输入中获取灯的数量n和第k个人的编号k。然后调用findLights函数找出开着的灯的编号,并将结果打印输出。

请注意,此解决方案假设灯的编号从1开始,而不是从0开始。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击