转自:www.jianshu.com/p/8ae9de4a9…
1, 一个房间有100盏灯(全是关着的),由编号1-100的开关(只有两种状态,开或者关)控制,门外有100个学生,学生按次序一次进入房间,第一个进入的学生切换是1的倍数的开关,第二个学生切换是2的倍数的开关,以此类推,问,第100学生进入切换后,还有多少盏灯是亮着的?*/
public class FaceOne { private static boolean[] lightStatus=new boolean[100];//默认false /* * 朴素计算 * 仅仅逻辑而已 * */ private static int getResult(boolean[] lightStatus){ for(int i=1;i<=100;i++){ for(int j=1;j<=100;j++){ if(j%i==0){ if(!lightStatus[j-1]){ lightStatus[j-1]=true; }else{ lightStatus[j-1]=false;
}
}
}
}
int count=0; for(int i=0;i<100;i++){ if(lightStatus[i]){ count++;
}
} return count; }
}
/*
* 以切换一次作为标准 +1 则最后就只有奇数的灯会亮着
* 排除素数 素数的约数只有1和本身
* 排除非素数 具有两两对应的 6 15 等这种数
* 剩余就是平方数 平方数由于约数中存在一对相同的两个
* 约数可以相乘得到结果,所有最后的约数个数肯定是奇数
* 所以 只要向下取 学生数的开方数即可
* */
private static int getResult(){
return (int)Math.sqrt(100);
}
public static void main(String[] args) {
System.out.println(getResult());
}