【ALGO】100盏灯问题

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;
            }
        }

     

上一篇:ALGO-1 区间k大数查询


下一篇:Algo_dfs、技巧_TODO