开灯问题
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000
输入
输入一组数据:n和k
输出
输出开着的灯编号
样例输入
7 3
样例输出
1 5 6 7
解题思路:
定义一个数组,下标代表灯的编号,利用双循环对数组赋值,比如,第一个人把所有灯打开,所有赋值为1,第二个人,把2的倍数的灯再加1,第三个人把3的倍数的灯加1,灯的开关与下表对应的数的奇偶性相关,奇数表示灯开,偶数表示灯关
// // main.cpp // c++prime // // Created by SJCHEN on 2019/1/19. // Copyright © 2019 SJCHEN. All rights reserved. // #include <iostream> #include <cstring> using namespace std; #define MAXN 1000 + 10 int a[MAXN]; // 定义一个数组,下标代表灯的编号,利用双循环对数组赋值,比如,第一个人把所有灯打开,所有赋值为1,第二个人,把2的倍数的灯再加1,第三个人把3的倍数的灯加1,灯的开关与下表对应的数的奇偶性相关,奇数表示灯开,偶数表示灯关 int main() { int n,k,i,j; cin >> n >> k; memset(a, 0, sizeof(a)); for (i = 1; i <= k; i++) {//灯数 for (j = 1; j <= n; j++) {//人数 if (j % i == 0) a[j]++; } } for (j = 1; j <= n; j++) { if (a[j] & 1) cout << j << " "; } cout << endl; return 0; }