开灯问题

mac2024-11-28  21

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

输入 n和k,输出开着的灯编号。k≤n≤1000。

输出 输出开着的灯编号,行末没有多余空格

样例输入

7 3

样例输出

1 5 6 7

思路: 用一个数组来记录灯的状况(初值设为-1表示关),下标对应灯的编号,当被按下之后*-1,当最后值为1的值对应的下标的灯即为亮着的

#include <iostream> #include <cstring> using namespace std; int main() { int n, k, flag = 0; cin >> n >> k; int* a = new int[n + 1]; //for (int i = 0; i <= n; ++i) // a[i] = -1; memset(a, -1, (n + 1) * sizeof(int)); for (int i = 1; i <= k; ++i) { for (int j = 1; j <= n; ++j) { if (j % i == 0) { a[j] = -a[j]; } } } for (int i = 1; i <= n; ++i) { if (a[i] == 1) { if (flag) cout << ' '; else flag = 1; cout << i ; } } return 0; }
最新回复(0)