问题:
开灯问题,有n盏灯,编号为1~n。第一个人把所有灯都打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),以此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。(k《n《1000)
分析:
用数组来存储灯的状态,判断灯是否开着。
代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define max 1010 5 int main() 6 { 7 int i, j, n, k, biao=0; // biao为标志变量,控制空格的输出。 8 int a[max]; 9 memset(a,0,sizeof(a)); // 把数组清零。0代表关灯,1代表开灯 10 scanf("%d%d",&n,&k); 11 12 for(i=1;i<=k;i++) 13 for(j=1;j<=n;j++) 14 if(j%i==0) 15 a[j]=!a[j]; // 取反 16 17 for(i=1;i<=n;i++) 18 if(a[i]) { // 值为真,即非0 19 if (biao) biao = 0; 20 else printf(" "); // 输出空格。 21 printf("%d ", i); 22 } 23 printf(" "); 24 return 0; 25 }