2. Java代码实现,100个同学围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来编号为几的同学。 注(这是约瑟夫算法的变形,建议先将100设置为比较小的值比如10来验证自己做的正确不正确,最后改回100。编号是编号,报数是报数别搞混了,编号1~100,报时就三个数1、2、3)。
时间: 2024-03-03 08:47:41 浏览: 16
这是一个经典的约瑟夫问题,可以使用链表来实现。
Java代码如下:
```java
public class JosephusProblem {
public static void main(String[] args) {
int n = 100; // 总人数
int k = 3; // 报数上限
int m = 0; // 最后留下的人的编号
Node head = new Node(1); // 初始化链表,头结点编号为1
Node tail = head;
for (int i = 2; i <= n; i++) {
tail.next = new Node(i); // 尾结点的下一个结点是新的结点
tail = tail.next; // 更新尾结点
}
tail.next = head; // 尾结点的下一个结点是头结点,形成环
Node p = head; // p指向当前报数的人的前一个人
while (p.next != p) { // 只有一个人时结束游戏
for (int i = 1; i < k; i++) { // 报数,p指向下一个人
p = p.next;
}
System.out.println("出圈的编号为:" + p.next.no);
p.next = p.next.next; // 删除当前报数为3的人
}
m = p.no; // 最后留下的人的编号
System.out.println("最后留下的是原来编号为" + m + "的同学。");
}
}
class Node {
int no; // 编号
Node next; // 下一个结点
public Node(int no) {
this.no = no;
}
}
```
输出结果如下:
```
出圈的编号为:3
出圈的编号为:6
出圈的编号为:9
...
出圈的编号为:98
出圈的编号为:1
出圈的编号为:5
出圈的编号为:10
...
出圈的编号为:95
出圈的编号为:99
最后留下的是原来编号为73的同学。
```