1 题目
- 有100盏灯泡,第一轮点亮所有电灯,第二轮每两盏灯熄灭一盏,即熄灭第2盏,第4盏,以此类推,第三轮改变编号为3的倍数的电灯,第3盏,第6盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,就点亮它,以此类推,直到第100轮。问第100结束后,还有多少盏灯泡是亮的
2 题解过程
- 思考:需要把每个灯泡的开关次数计算出来,其实这里需要你抽象转化为求一个数字的约数个数问题---->只要一个数字的约数是奇数个,那么这盏灯就是点亮的。而且一个数的约数是成对出现的,那么什么数字的约数(A==B)呢? 其实就是完全平方数,如 4 的约数集合(1,2,4)(1,4成对)(2,2成对)算作一个。
- 于是:对于1~100这些数字中,哪些数的约数是奇数个呢?因为约数都是成对出现的,所以约数为奇数个的数字就是完全平方数~
-
public class Test { public static void main(String []args) { byte[] lights = new byte[100]; // 模拟100个人开关灯场景 i 表示人 j 表示灯 for(int i = 1;i <= 100;i++){ for(int j = 0;j < 100;j++){ if((j + 1) % i == 0){ if(lights[j] == 0){ lights[j] = 1; }else{ lights[j] = 0; } } } } // 统计结果 for(int i = 0;i < 100;i++){ if(lights[i] == 1){ System.out.println(i + 1); } } } } // 最直接 public static void main(String[] args) { int cur = 1; int i = 1; while(cur<=100){ System.out.print(cur+" "); i++; cur = i*i; } }