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