n个人围成一个圈,从第一个人开始报数,报到第m个人出圈,继续从下一个人开始报数,再次报到第m个人出圈
时间: 2023-03-26 10:01:57 浏览: 266
这是一个经典的约瑟夫问题,可以使用数学方法解决。假设n个人的编号分别为1,2,3,...,n,第一个出圈的人编号为k,则第二次报数时,从编号为k+1的人开始报数,即从k+1,k+2,...,n,1,2,...,k-2,k-1开始报数。设第二次出圈的人编号为x,则有:
x = (k + m - 1) % n
其中,%表示取模运算。因为第一个出圈的人已经占了一个位置,所以第二次报数时,只剩下n-1个人。如果x小于k,则x=x+n。依此类推,直到只剩下最后一个人为止。
因此,可以使用循环来模拟这个过程,每次计算出下一个出圈的人的编号,直到只剩下一个人为止。
相关问题
用java写出N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,找到最后一人的编号
好的,这是一个经典的约瑟夫问题。具体的解法可以使用循环链表来实现,Java代码如下:
```
import java.util.*;
public class Joseph {
public static int findLast(int n, int m) {
List<Integer> list = new LinkedList<>();
for (int i = 1; i <= n; i++) {
list.add(i);
}
int idx = 0;
while (list.size() > 1) {
idx = (idx + m - 1) % list.size();
list.remove(idx);
}
return list.get(0);
}
public static void main(String[] args) {
int n = 10;
int m = 3;
int last = findLast(n, m);
System.out.println("The last person's number is: " + last);
}
}
```
当输入n=10,m=3时,程序的输出为:
```
The last person's number is: 4
```
也就是说,最后剩下的人的编号是4。
有 m 个人,其编号分别为 1~m。按顺序围成一个圈,现在给定一个数 n,从第一个人开始依次报数,报到 n 的人出圈,然后再从下一个人开始,继续从 1 开始依次报数,报到 n 的人再出圈,……如此循环,直到最后一个人出圈为止。
这是一个经典的约瑟夫问题,可以使用循环链表来解决。
首先,将 m 个人的编号依次存储在循环链表中。然后从第一个人开始,依次报数,每次报数到 n 的人出圈,直到只剩下最后一个人。
具体实现时,可以使用一个指针 p 指向当前报数的人,每次报数时将指针 p 沿着循环链表顺时针移动 n-1 个位置,然后将 p 指向的人出圈。出圈后,将 p 指向下一个人,继续从 1 开始报数,直到只剩下最后一个人。
最后剩下的那个人即为解。
阅读全文
相关推荐












