例3-1 开灯问题
问题:有n盏灯,编号为1-n。第1个人把所有的灯都打开,第2个人按下所有编号为2的倍数灯的开关,第3个人按下所有编号为3的倍数灯的开关,以此类推。一共有k个人,问最后哪些灯开着?输入n和k,输出最后亮着的灯的编号。k<=n<=1000;
样例输入:7 3
样例输出:1 5 6 7
分析:感觉这个问题还是比较容易的,假如有初学者读到,可以自己好好想想
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAX_NUM 100 5 int lgt_sta[MAX_NUM]; 6 7 int main(void) 8 { 9 int n = 0; //the number of lights 10 int k = 0; //the number of people 11 int i = 0; 12 int j = 0; 13 memset(lgt_sta, 0x00, sizeof(lgt_sta)); //初始状态为0代表都开着,第1个人再不考虑 14 15 printf("enter the number of lights:"); 16 scanf("%d", &n); 17 printf("enter the number of people:"); 18 scanf("%d", &k); 19 for (i = 2; i <= k; i++) //从第2个人开始处理 20 { 21 for (j = 1; j <= n; j++) 22 { 23 if (j % i == 0) 24 { 25 lgt_sta[j-1] = !lgt_sta[j-1]; //开关状态的转化 26 } 27 } 28 } 29 for (i = 0; i < n; i++) //看看数组里面是什么 30 { 31 printf("%d ", lgt_sta[i]); 32 } 33 printf("\n"); 34 35 for (i = 0; i < n; i++) 36 { 37 if (!lgt_sta[i]) 38 { 39 printf("%d ", i+1); 40 } 41 } 42 printf("\n"); 43 44 return 0; 45 }
浙公网安备 33010602011771号