开灯问题

问题描述:有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关,依此类推,一共k个人,问最后有哪些灯开着?   输入n,k,输出开着的灯的编号。  k<=n<=1000

思路:定义一个存储灯的布尔类型的数组,将它们的值都设置为false,表示灭。然后遍历处理一下,输出值为真的灯的编号。

 1 #include<iostream>    
 2 
 3 using namespace std;
 4 bool a[100];
 5 int main()
 6 {
 7     int n, k;
 8     cin >> n >> k;
 9     memset(a, false, sizeof(int));  // 将数组全部置为false
10 
11     for (int i = 1; i <= k; i++)          //    有k个人
12         for (int j = 1; j <= n; j++) {      //  有n盏灯
13             if (j%i == 0) a[j] = !a[j];       // 如果灯的编号不是人的编号的倍数,将数组置反。
14         }
15     for (int i = 1; i <= n; i++) {   //   打印合格数据
16         if (a[i])cout << i << " ";
17     }
18 
19     system("pause");
20 }
原文地址:https://www.cnblogs.com/ll-10/p/9574143.html