有N盏灯,编号为1~N。第一个人把所有的等打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),以此类推,一共有K个人,问最后有哪些灯开着?
输入N和K,输出开着的灯的编号。K<=N<=1000。
样例输入:7 3
样例输入:1 5 6 7
分析:
1. 从题意可得最多有1000盏灯,所以用一个一维数组表示1~N盏灯的情况
即:a[1],a[2],a[3],a[4]......分别表示第一盏灯,第二盏灯,第三盏灯,第四盏灯……
2. 用0表示灯是关闭的,用1表示灯是开着的
3. 第一层循环可以用K作为循环条件,第二次循环可以用N作为循环条件
代码部份:
#include <iostream>
#define MAXN 1000 + 10 //为什么要1000+10,而不是1000了?答案:保险
using namespace std;
int main()
{
int N, K;
int i, j;
int array[MAXN] = {0,};
cin >> N >> K;
for( i = 1; i <= K; i++)
{
for( j = 1; j <= N; j++ )
{
if( 0 == j % i ) //第i个人是否需要拨动第j盏灯的开关
{
array[j]++; //每拨动一次开关,array[j]就自加1
}
}
}
for( j = 1; j <= N; j++ )
{
if( 1 == array[j] % 2 ) //开关上累加的数如果对2取余等于0,说明灯是关着的,否则为1时,灯就是开着的
{
cout<<j<<" ";
}
}
cout<<endl;
}