java解决假如有 100 名犯人,现在报数为奇数的 枪毙,偶数的存活,存活的罪犯重新排序,再次报数,奇数枪毙,请问,最后第几名 犯人可以存活?代码
时间: 2023-10-03 19:10:09 浏览: 618
以下是 Java 代码:
```java
public class Prisoners {
public static void main(String[] args) {
int n = 100; // 犯人总数
boolean[] prisoners = new boolean[n]; // 存储犯人是否存活的数组
for (int i = 0; i < n; i++) {
prisoners[i] = true; // 初始化所有犯人都存活
}
int count = 0; // 报数计数器
int index = 0; // 犯人编号
while (true) {
if (prisoners[index]) {
count++;
if (count % 2 == 1) {
prisoners[index] = false; // 奇数枪毙
}
}
boolean allDead = true; // 判断是否所有存活的犯人都已枪毙
for (int i = 0; i < n; i++) {
if (prisoners[i]) {
allDead = false;
break;
}
}
if (allDead) {
break; // 所有存活的犯人都已枪毙,结束循环
}
index = (index + 1) % n; // 下一个犯人的编号
}
// 存活的犯人重新排序
int[] alivePrisoners = new int[n / 2];
int pos = 0;
for (int i = 0; i < n; i++) {
if (prisoners[i]) {
alivePrisoners[pos++] = i;
}
}
// 再次报数,奇数枪毙
n = n / 2;
prisoners = new boolean[n];
for (int i = 0; i < n; i++) {
prisoners[i] = true;
}
count = 0;
index = 0;
while (true) {
if (prisoners[index]) {
count++;
if (count % 2 == 1) {
prisoners[index] = false;
}
}
boolean allDead = true;
for (int i = 0; i < n; i++) {
if (prisoners[i]) {
allDead = false;
break;
}
}
if (allDead) {
break;
}
index = (index + 1) % n;
}
System.out.println("最后存活的犯人编号为:" + alivePrisoners[index]);
}
}
```
这段代码中,我们使用了一个 boolean 数组 `prisoners` 存储每个犯人是否存活。首先,我们初始化所有犯人都存活,然后进行报数,奇数枪毙,偶数存活,直到所有存活的犯人都已枪毙。存活的犯人重新排序,再次报数,奇数枪毙,最后输出最后存活的犯人编号。
阅读全文