题目:
N盏灯排成一排,从1到N按顺序依次编号。有N个人也从1到N依次编号。第一个人(1号)将灯全部关闭。第二个人(2号)将凡是2和2的倍数的灯打开。第三个人(3号)将凡是3和3的倍数的灯做相反的处理(如果该灯为打开的,则将它关闭;如果该灯为关闭的,则将它打开)。以后的人都和3号一样,将凡是与自己编号相同的灯,以及是自己编号倍数的灯做相反处理。请问:当第N个人操作之后,哪几盏灯是亮的?
代码:
#include<iostream>
using namespace std;
int t = 2; //全局变量
void func(int a[], int n)
{
for (int i = 0; i < n; i++) {
if ((i + 1) % t == 0) a[i] = !a[i];
}
t++;
if (t <= n) func(a, n); //递归
}
int main()
{
int N;
int* a;
cin >> N;
if (N == 1) //如果就是1盏灯,1个人
{
cout << "没有灯亮" << endl;
return 0;
}
a = new int[N]; //定义动态数组
for (int i = 0; i < N; i++)
{
a[i] = 0;
}
func(a, N);
for (int i = 0; i < N; i++)
{ if(a[i])
cout << "第" << i + 1 << "盏灯亮"<<endl;
}
delete[] a;
return 0;
}
定义动态数组的方法有很多,也可以直接用vector容器更加简单。