1.1. 问题描述
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯被打开,开着灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?
1.2. 问题分析
题目并没有什么难度,构建一个布尔数组,遍历灯与人即可。
1.3. 代码实现
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入灯数量:");
int lightCount = scanner.nextInt();
System.out.println("请输入人数:");
int humanCount = scanner.nextInt();
scanner.close();
boolean[] lights = new boolean[lightCount+1];
for (int i = 1; i < humanCount + 1; i++) { //这里外层循环选择人,内层循环遍历起始数字就不必从1开始
for (int j = i; j < lightCount+1; j++) {
if (j % i == 0) {
lights[j] = !lights[j];
}
}
}
int turnOnCount = 0;
StringBuffer sb = new StringBuffer();
sb.append("开灯序号:");
for (int i = 1; i < lightCount + 1; i++) {
if (lights[i]) {
sb.append(" " + i);
turnOnCount ++;
}
}
System.out.println(sb);
System.out.println("亮灯数量: " + turnOnCount);
}
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入灯数量:");
int lightCount = scanner.nextInt();
System.out.println("请输入人数:");
int humanCount = scanner.nextInt();
scanner.close();
boolean[] lights = new boolean[lightCount+1];
for (int i = 1; i < humanCount + 1; i++) { //这里外层循环选择人,内层循环遍历起始数字就不必从1开始
for (int j = i; j < lightCount+1; j++) {
if (j % i == 0) {
lights[j] = !lights[j];
}
}
}
int turnOnCount = 0;
StringBuffer sb = new StringBuffer();
sb.append("开灯序号:");
for (int i = 1; i < lightCount + 1; i++) {
if (lights[i]) {
sb.append(" " + i);
turnOnCount ++;
}
}
System.out.println(sb);
System.out.println("亮灯数量: " + turnOnCount);
}