一:题意
房间里有100盏电灯,编号为1,2,3……100,每盏灯上有一个按钮,初始时灯全都是关的。编好号的100位同学由房间外依次走进去,将自己编号的倍数的灯的按钮全部按一次
请问依次走完后,还有多少盏灯亮着?
二:实现
1:暴力法
/**
* 暴力法
* 时间复杂度:O(n*n)
*/
public class Test {
public static void main(String[] args) {
int[] light = new int[101];
//初始化为灯关闭
for (int i = 1; i < light.length; i++) {
light[i] = 0;
}
//关灯操作
for (int i = 1; i < light.length; i++) {
for (int j = 1; j < light.length; j++) {
if(j%i == 0) {
light[j] = light[j] == 0 ? 1 : 0;
}
}
}
//输出打开的灯
for (int i = 1; i < light.length; i++) {
if(light[i] == 1)
System.out.println(i);
}
/**
* 输出
* 1
* 4
* 9
* 16
* 25
* 36
* 49
* 64
* 81
* 100
*/
}
}
2:优化一:
/**
* 优化暴力法
* 时间复杂度:O(n*n),但会比单纯的暴力法时间复杂度低
*/
public class Test {
public static void main(String[] args) {
int[] light = new int[101];
//初始化为灯关闭
for (int i = 1; i < light.length; i++) {
light[i] = 0;
}
//关灯操作
for (int i = 1; i < light.length; i++) {
for (int j = 1; j < i; j++) {
if(i%j == 0) {
light[i]++;
}
}
}
//输出打开的灯
for (int i = 1; i < light.length; i++) {
if(light[i]%2 == 0)
System.out.println(i);
}
/**
* 输出
* 1
* 4
* 9
* 16
* 25
* 36
* 49
* 64
* 81
* 100
*/
}
}
3:优化二:
/**
* 具体问题具体分析,没有通用性
* 时间复杂度:O(n)
*/
public class Test {
public static void main(String[] args) {
int[] light = new int[101];
//初始化为灯关闭
for (int i = 1; i < light.length; i++) {
light[i] = 0;
}
//关灯操作并输出
for (int i = 1; i < light.length; i++) {
double k = Math.sqrt(i);
int m = (int)k;
if((double)m == k) {
System.out.println(i);
}
}
/**
* 输出
* 1
* 4
* 9
* 16
* 25
* 36
* 49
* 64
* 81
* 100
*/
}
}