java解决就简单的亮灯问题

100个房间 每个房间 1 盏灯    这些灯都是灭的
    // 1 2 3 4 5 6 7 8 9
    100个人coming
        第1个人    来到每个房间前
            如果房间编号能够整除1 (人的编号)
            拉一下灯
        第2个人    来到每个房间前
            如果房间编号能够整除2 (人的编号)
            拉一下灯
        第3个人    来到每个房间前
            如果房间编号能够整除3 (人的编号)
            拉一下灯
        。。。
        问:当 100 个人都拉完灯之后 哪些灯是亮的
        答:1 4 9 16 25 36 49 64 81 100

第一种:房间不动 人进行动态,但是只有小于等于房间编号的人才有机会被整除.

例如房间 32号  人33号,那么32号以后的人就无法被整除直接简化  j<=i

public class Test01{
	public static void main(String[] args){
		boolean flag;//灭的
		int i=1;
		for(i=1;i<=100;i++){//一百个房间
			flag=false;
			for(int j=1;j<=i;j++){//小于等于i的人才能有机会整除
				if(i%j==0){
					flag=!flag;
				}
			}
			if(flag){
				System.out.println(i);
			}
		}

	}
}

第二种:

public class Test02{
    public static void main(String[] args){
		// false
		boolean[] data = new boolean[100];
		// 人-外层
		for(int ren = 1; ren <= 100; ren++){
			// 人的编号是定的
			for(int room = 1; room <= 100; room++){
				// 人-1	房间-room=1
				// 如果 room 能够整除ren
				if(room%ren == 0){
					// 人进房间 拉data[room-1]灯
					data[room-1] = !data[room-1];
				}
			}
		}
		// 编号 = index+1
		for(int index = 0; index < data.length; index++){
			if(data[index]){// true
				System.out.println(index+1);
			}
		}
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值