一共有n盏灯(编号为1~n),第一个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将会被关掉),第3个人按下所有编号为3的倍数的开关(其中关着的灯将被打开开着了灯将会关闭),依此类推,一共有K个人和n盏灯,请问最后有哪些灯开着。
输入n和k ,输出开着的灯的编号,k<=n<=1000.
代码实现:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int n ,k;
cin>>n>>k;
int L[n+1]={0}; // 初始化数组 , 也可以使用memset()函数(需要string.h头文件)
// 数组中元素初始均为0,代表均处于关闭状态
/* int L[n+1];
memset(L,0,sizeof(L)); //memset(数组名,初始化的值,数组长度)
*/
for (int j=1;j<=k;j++)
{
for(int i=1;i<=int(n/j);i++)
{
L[i*j]++;
// 记录每个灯的改变状态的次数
}
}
for(int s=1;s<=n;s++)
if(L[s]%2)
// 奇数代表灯最终处于开启状态
cout<<s<<" ";
}
运行结果: