约瑟夫问题java代码
时间: 2024-10-24 11:08:39 浏览: 16
约瑟夫问题-基于java+双链表实现的约瑟夫问题题解.zip
约瑟夫环(Josephus Problem)是一个经典的问题,通常涉及在一个数组(或环形链表)中每隔k步删除一个元素,直到只剩下一个元素为止。以下是使用Java编写的一个基本版本的约瑟夫环解决方案:
```java
public class Josephus {
public static int josephus(int n, int k) {
if (n <= 0 || k <= 0 || k > n) {
throw new IllegalArgumentException("Invalid input: n must be greater than k and both positive.");
}
// 使用模运算模拟环形数组,从1开始计数
int count = 1;
for (int i = 0; i < n - 1) % k == 0) { // 当计数值除以k余数为0时,表示该轮到删除
count = (count + 1) % n; // 删除当前元素,然后移动到下一位
} else {
count = (count + 1) % n; // 否则,跳过删除,继续前进
}
}
return count; // 返回最后一个存活的数字
}
public static void main(String[] args) {
int n = 10; // 环中有10个人
int k = 3; // 每隔3步删除一个人
System.out.println("The last person remaining is: " + josephus(n, k));
}
}
```
在这个代码中,`josephus`函数接受两个参数,数组长度`n`和间隔步长`k`,计算并返回最后剩下的那个人的编号。
阅读全文