Java 宾馆里有100个房间,有100名服务员。1号服务员把所有房间的门打开了。2号服务员把2的倍数的房间关上了。3号及以后的服务员把自己编号倍数的房间开着的关上、关着的打开了。问100名服务员全部操作完之后,哪些房间是打开着的? 代码生成
时间: 2024-11-03 22:17:12 浏览: 24
这个问题是一个经典的程序设计问题,通常通过位运算来解决。因为每个房间的状态可以用二进制表示,最右边的一位代表是否开门(0 关闭,1 打开)。每次服务员的操作都是对特定编号房间的开关状态进行取反,而每位服务员只会操作他编号对应的所有位。
我们可以初始化一个整型变量,用二进制表示所有房间的状态,然后根据服务员的操作逐个更新。例如,第i号服务员的操作就是将第i位进行取反。最后,检查变量中最低的1位就是最后打开的房间号码(因为只有最后一个房间的开关会被改变)。
以下是简单的Java代码实现:
```java
public class RoomService {
private int roomStatus = 0; // 初始化所有房间关闭
public void service(int servantNum) {
roomStatus ^= (1 << servantNum - 1); // 取反当前服务员对应的位
}
public static void main(String[] args) {
RoomService roomService = new RoomService();
for (int i = 1; i <= 100; i++) {
roomService.service(i);
}
System.out.println("最后打开的房间号是:" + Integer.lowestOneBit(roomStatus));
}
}
```
运行这段代码后,`roomStatus` 中最低的1位的索引即为最终打开的房间号。
阅读全文