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++中什么是向量?
