c++开关灯问题(少儿编程开关灯)
题目
有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开始。
- 上一篇:我的唐朝印象
- 下一篇:C++中什么是向量?