题目描述
有n盏灯,编号为1-n,第一个人把所有的灯打开,第二个人按下所有编号为2的倍数的灯(这些灯将会被关掉),第三个人按下所有编号为3的倍数的灯(其中关掉的灯将会被打开,打开的等将会被关掉),依次类推,一共有k个人,问最后又那些灯开着?输入n和k,输出开着的灯的编号.0≤k≤n≤1000
输入
灯的数目n,人数k
输出
最后有哪些灯时开着的,如果所有灯都灭了,输出”None“
样例输入
7 3
样例输出
1 5 6 7
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int k = cin.nextInt();
int[] light = new int[n + 10];//空间略大 防止越界
boolean[] flag = new boolean[n + 10];
for (int i = 1; i <= n; i++) {
light[i] = i;
flag[i] = true; //第一个人操作
}
for (int i = 2; i <= k; i++) {
for (int j = i; j <= n; j+=i) { //编号翻倍
flag[j]=!flag[j];
}
}
if (k == 0) {
System.out.println("None");
} else {
for (int i = 1; i <= n; i++) {
if (flag[i]) {//true 即最后还亮着的灯
System.out.print(light[i] + " ");
}
}
}
//method2
// int count, i, j;
// int n = cin.nextInt();
// int k = cin.nextInt();
// if (k == 0) {
// System.out.printf("None");
// } else {
// for (i = 1; i <= n; i++) {
// count = 0;//关
// for (j = 1; j <= k; j++) {
// if (i % j == 0) {
// count ++; //开关开关开...
// }
// }//从抽象的数学角度对每个灯考虑经过k个人操作后是否还亮
// if (count % 2 == 1) {
// System.out.printf("%d ", i);
// }
// }
// }
cin.close();
}
}