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);
}
本文通过布尔数组模拟了n盏灯被k个人依次操作后的状态变化过程,详细介绍了如何通过编程解决问题,并给出了完整的Java代码实现。同时,文章还进一步探讨了当人与灯数量相等时,最终亮灯数量与序号的规律。
1万+

被折叠的 条评论
为什么被折叠?



