p1996 约瑟夫问题java
时间: 2023-11-04 09:54:29 浏览: 44
约瑟夫问题是一个数学应用问题,描述了n个人围坐在一张圆桌周围,从编号为k的人开始报数,每报到m的人出列,然后下一个人从1开始重新报数,直到所有人都出列为止。
在这个Java代码中,首先通过Scanner类获取输入的总人数n和报数的间隔m。然后使用LinkedList类创建一个链表sites,并依次将人的编号加入链表中。接下来,通过一个循环来模拟约瑟夫环的过程。在每一轮循环中,根据规则判断是移动链表的头结点还是将头结点移除并输出。当链表为空时,表示所有人都已经出列,循环结束。
相关问题
约瑟夫问题java循环链表
约瑟夫问题是一个经典的数学问题,涉及到循环链表的应用。在约瑟夫问题中,有n个人围成一圈,从第一个人开始报数,每报到m的人出圈,然后从下一个人重新开始报数,直到所有人都出圈为止。Java中可以使用循环链表来解决约瑟夫问题。
以下是一个使用Java循环链表解决约瑟夫问题的示例代码:
```java
import java.util.LinkedList;
public class JosephusProblem {
public static void main(String[] args) {
int n = 7; // 总人数
int m = 3; // 报数到m的人出圈
LinkedList<Integer> circle = new LinkedList<>();
for (int i = 1; i <= n; i++) {
circle.add(i);
}
int index = 0; // 当前报数的人在链表中的索引
while (circle.size() > 1) {
index = (index + m - 1) % circle.size(); // 计算出圈的人在链表中的索引
circle.remove(index);
}
System.out.println("最后留下的人是:" + circle.get(0));
}
}
```
这段代码首先创建了一个LinkedList对象circle,用于表示循环链表。然后,通过循环将1到n的数字依次添加到链表中。接下来,使用一个while循环来模拟报数和出圈的过程,直到链表中只剩下一个人。在每次循环中,根据报数规则计算出圈的人在链表中的索引,并将其从链表中移除。最后,输出剩下的最后一个人。
循环链表约瑟夫问题java
循环链表约瑟夫问题是一个经典的问题,可以使用循环链表的数据结构来解决。下面是一个Java的解决方法的示例:
```java
import java.util.LinkedList;
public class JosephProblem {
public int joseph(int n, int m) {
LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < n; i++) {
list.add(i);
}
int index = 0;
while (list.size() > 1) {
index = (index + m - 1) % list.size();
list.remove(index);
}
return list.get(0);
}
public static void main(String[] args) {
JosephProblem josephProblem = new JosephProblem();
int n = 7; // 总人数
int m = 3; // 报数的间隔
int result = josephProblem.joseph(n, m);
System.out.println("最后剩下的人的编号是:" + result);
}
}
```
这段代码中,我们首先创建一个循环链表,然后从0到n-1依次添加元素。接下来,我们使用一个循环来模拟报数的过程,每次报到m的人将被移除链表。最后,当链表中只剩下一个人时,该人即为最后剩下的人。