用Java实现约瑟夫问题 n个人围城一个圈,从1开始报数,每数到3的倍数的人离开圈子,循环往复直到最后圈中只剩下一人为止,求剩下的人原来在圈中的位置。 用泛型方法实现,输出格式为 [ans]
时间: 2024-03-02 18:47:54 浏览: 94
好的,这是一道经典的约瑟夫问题,以下是使用 Java 实现的代码:
```java
import java.util.*;
public class Josephus {
public static <T> T josephusProblem(int n, int k) {
if (n <= 0 || k <= 0) {
return null;
}
List<T> list = new LinkedList<>();
for (int i = 1; i <= n; i++) {
list.add((T) Integer.valueOf(i));
}
int index = 0;
while (list.size() > 1) {
index = (index + k - 1) % list.size();
list.remove(index);
}
return list.get(0);
}
public static void main(String[] args) {
int n = 8;
int k = 3;
Integer ans = josephusProblem(n, k);
System.out.println("[" + ans + "]");
}
}
```
在上面的代码中,我们使用了泛型方法 `josephusProblem` 来解决约瑟夫问题。该方法接受两个整数 `n` 和 `k`,表示有 `n` 个人围城一个圈,每数到 `k` 的倍数的人离开圈子。最后,该方法返回剩下的人原来在圈中的位置。
在方法中,我们首先判断传入的参数是否合法,如果不合法,则返回 `null`。然后,我们使用一个 `LinkedList` 来存储 `1` 到 `n` 的整数,并且使用一个变量 `index` 来表示当前数的位置。接着,我们进入一个循环,直到列表中只剩下一个元素为止。在循环中,我们根据公式 `(index + k - 1) % list.size()` 计算出下一个要离开圈子的人的位置,并将该位置的元素从列表中删除。最后,我们返回列表中剩下的元素,即为剩下的人原来在圈中的位置。
在 `main` 方法中,我们定义两个整数 `n` 和 `k`,并使用 `josephusProblem` 方法求解约瑟夫问题。最后,我们将结果以 `[ans]` 的格式输出。
阅读全文