题目
有n盏灯,编号为1~n,第一个人把所有灯打开,第二个人按下所有编号为2的倍数开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),一次类推,一共有k个人,问最后哪些灯开着?
输入: 7 3
输出 : 1 5 6 7
思路
思路也是挺简单的,用一个布尔数组去保存灯的开关状态,为true时是开着的,false为关闭着的,然后做一次遍历即可,详情看代码
代码
#include<iostream>
using namespace std;
bool trek[100];
void main()
{
int n,k;
cin>>n>>k;
memset(trek,true,100*sizeof(bool));//这个函数的作用是让所有的都为true
for(int i=2;i<=k;i++){
int pos=i;
while(pos<=n){
trek[pos] = !trek[pos]; //反转
pos+=i; //找到所有的倍数
}
}
for(i=1;i<=n;i++){ //输出
if(trek[i]) cout<<i<<" ";
}
}