[C++] 开灯问题(两个思路)
两个思路
一个用到数组,从人的角度出发;
一个不用数组,从灯泡的角度出发。
题目
有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k≤n≤1000。
样例输入:
7 3
样例输出:
1 5 6 7
第一个思路分析
创建一个a[n]数组,开灯全置1代表灯亮状态,后每次操作(不管开灯还是关灯)时,都对原来元素取非。最后依次判断灯泡状态,输出。
代码实现
int main()
{
int n, k, i;
cin>>n>>k;
int a[n];
for(i = 0; i < n; i++) //初始化灯泡
a[i] = 1;
for(i = 2; i <= k; i++)
{
for(int p = 1; p < n; p++)
{
if((p+1) % i == 0) //操作开关
a[p] = !a[p];
}
}
for(i = 0; i < n; i++)
{
if(a[i]) //判断输出
cout<<i+1<<" ";
}
return 0;
}
第二个思路分析
不用初始化数组,用一个字符m=1表示灯泡开着,然后分别对每一个灯泡操作,比如7个灯泡4个人,那么循环到第2个灯泡,只需要第2个人操作一次,循环到第4个灯泡需要第2个和第4个人总操作两次。在遍历所有从第2个开始的所有人后,判断灯泡状态。
代码实现
int main()
{
int n, k, m = 1;
cin>>n>>k;
for(int i = 1; i <= n; i++)
{
for(int p = 2; p <= k; p++)
{
if(i % p == 0 ) //操作灯泡
m = !m;
}
if(m) //判断输出
cout<<i;
m = 1;
}
return 0;
}
版权声明:本文为Cedric_6原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。