开灯问题

Posted ll-10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开灯问题相关的知识,希望对你有一定的参考价值。

问题描述:有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 }

 

以上是关于开灯问题的主要内容,如果未能解决你的问题,请参考以下文章

开灯问题

开灯问题

开灯问题

开灯问题--------《算法竞赛入门指导》P83

NYOJ_77 开灯问题

算法竞赛入门经典_3.1_数组_逆序输出_开灯问题