描述
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000
- 输入
- 输入一组数据:n和k 输出
- 输出开着的灯编号 样例输入
-
7 3
样例输出 -
1 5 6 7
-
-
import java.util.*; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(),k=in.nextInt(); boolean[] b=new boolean[n+1]; int i,j; for ( i = 1; i<=n; i++) b[i]=true; for ( j =2; j <=k; j++) { for ( i = 1; i<=n; i++) { if(i%j==0){ if(b[i]) b[i]=false; else b[i]=true; } else continue; } } for (int j2 = 1; j2 <=n; j2++) { if(b[j2]) System.out.print(j2+" "); } } }
-
设置一个标志数组,true表示灯开着,false表示灯关着,先全部初始化为开灯,即第一个人的动作,然后从第二个人开始循环,满足条件即更改数组的值,从而实现
-
对于O(n2)的复杂度进行小小的修改:
-
for ( j =2; j <=k; j++) {
for ( i = j; i<=n; i+=j) {//寻找i的倍数
b[i]=!b[i];//反转数组!
}
}