开灯问题

描述

  有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 }

 

posted @ 2016-05-10 14:53  新生代黑马  阅读(231)  评论(0)    收藏  举报