开灯问题
描述
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000
- 输入
- 输入一组数据:n和k
- 输出
- 输出开着的灯编号
- 样例输入
7 3
样例输出
1 5 6 7
测试代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <assert.h> 5 6 int main() 7 { 8 int n, k, i, j; 9 int *light; 10 scanf("%d%d", &n, &k); 11 light = (int *)calloc(n + 1, sizeof(int)); 12 assert(light != NULL); 13 memset(light, 0, sizeof(light)); 14 for (i = 1; i <= n; i++) 15 { 16 light[i] = 1; 17 } 18 for (i = 2; i <= k; i++) 19 { 20 for (j = i; j <= n; j += i) 21 { 22 light[j] = -light[j]; 23 } 24 } 25 for (i = 1; i <= n; i++) 26 { 27 if (light[i] == 1) 28 { 29 printf("%d ", i); 30 } 31 } 32 return 0; 33 }

浙公网安备 33010602011771号