开灯问题
有n栈灯,编号为1~n。第一个人把所有的灯打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关掉),以此类推,一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。 k<=n<=10000
样例输入
7 3
样例输出
1 5 6 7
【分析】用a[1],a[2],…a[n]表示编号为1,2,3…,n的灯的状态。模拟上述操作即可。
#include <stdio.h>
#include <string.h>
#define maxn 1010
int a[maxn];
int main()
{
int n,k,first = 1;
scanf("%d %d", &n, &k);
memset( a, 0, sizeof(a)); //将存储灯状态的数组a清零
for (int i = 1; i <= n; ++i){
for(int j = 1; j <= k; ++j){ //这一块的作用是用j,i分别遍历 1~k, 1~n
if(i%j==0) // i%j==0 代表寻找到所有j的倍数的灯
a[i]=!a[i]; //让该灯的状态改变一次
}
}
for(int u = 1; u <= n; ++u){
if(a[u]) //如果a[u]!=0,则该灯开着,进行下面的操作
{
if(first)
first = 0;//为了避免输出多余的空格,设置了一个标志变量first,可以表示当前要输出的变量是否为第一个
else //第一个变量前不应有空格,但其他变量都有
printf(" ");
printf("%d",u);
}
}
printf("\n");
return 0;
}