【问题描述】有 n 个人围成一圈,顺序排号,从第 1 个人开始报数,从 1 报到 m,凡报到 m 的人退 出圈子,问最后留下的是原来第几号的人?下列函数完成上述处理,其中 m、n 的(m<n) 值由主调函数输入,函数返回值为所求结果。 【输入形式】n m 其中n>m 【输出形式】问最后留下的是原来第几号的人
时间: 2023-06-12 20:07:48 浏览: 54
以下是一个可能的 C++ 实现:
```cpp
int josephus(int n, int m) {
int ans = 0;
for (int i = 2; i <= n; i++) {
ans = (ans + m) % i;
}
return ans + 1;
}
```
该函数的参数 `n` 表示总人数,`m` 表示每次报数的上限,返回最后留下的人的编号。函数使用了一个简单的数学方法来解决该问题,称为约瑟夫环问题。该方法的基本思想是,对于每一轮报数,留下的人的编号可以通过前一轮留下的人的编号计算得出。具体来说,假设在上一轮中留下的人的编号为 `x`,则在本轮中,从 `x` 开始向后数 `m` 个人,得到的人的编号为 `(x + m) % n`。由于每轮都是在剩余人数之间进行报数,因此可以用模运算来确保计算的结果不超出范围。
在该函数中,我们从第二个人开始,依次计算每一轮留下的人的编号。初始时,留下的人的编号为 0,因为第一轮的起点是第一个人。在每一轮中,我们根据上一轮留下的人的编号 `ans`,计算本轮留下的人的编号 `(ans + m) % i`,其中 `i` 表示当前剩余的人数。最后,返回最后留下的人的编号时,需要将编号加 1,以转换为从 1 开始编号的人。
相关问题
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问
最后留下的是原来第几号的那位?
这是一个经典的约瑟夫问题。根据引用中的解题思路,我们可以写一个函数来解决这个问题。具体步骤如下:
1. 定义一个大小为n的一维数组,初始化为从1到n。
2. 设一个计数器,按照题述条件,遍历每一个数组元素,并从1到3报数,若当前元素计数为3则将其从数组中删除(即标记该人出局),同时使计数器置0并记录出局人数。
3. 如果出局人数为n-1人(即只剩下1人)终止循环,否则由外层循环控制使得再次遍历数组,直到踢出n-1人。
4. 最后满足只剩1人的条件后,再次遍历数组,找出那个最终没有被踢出的人,并返回其序号。
因此,最后留下的是原来第几号的那位取决于n和报数的规则。如果n=5,报数规则为从1到3,则最后留下的是原来第3号的那位。如果n=10,报数规则为从1到2,则最后留下的是原来第5号的那位。
有 n 个人绕成圆圈,按照顺序排号 (1-n) ,第一个人从 1 开始依次报数,报到 3 的人
假设n个人绕成圆圈,按照顺序排号(1-n),第一个人从1开始依次报数,报到3的人。当第一个人报数时,他报“1”。接着第二个人报数,他报“2”。当轮到第三个人报数时,他报“3”,因为他报到了3,所以他出局。然后从第四个人开始重新报数,报数的序列重新开始。每次报到3的人都会出局,直到只剩下一个人为止。
为了更好地理解这个过程,我们可以举一个具体例子。假设n=5,即有5个人围成一圈。他们的初始编号依次为1、2、3、4、5。每次报数,我们可以用A<sub>1</sub>、A<sub>2</sub>、A<sub>3</sub>、A<sub>4</sub>、A<sub>5</sub>来表示他们的位置。开始时,A<sub>1</sub>报数“1”,A<sub>2</sub>报数“2”,A<sub>3</sub>报数“3”,所以A<sub>3</sub>出局。然后从A<sub>4</sub>开始重新报数。这一轮报数过程中,A<sub>4</sub>报数“1”,A<sub>5</sub>报数“2”,A<sub>1</sub>报数“3”,所以A<sub>1</sub>出局。接着从A<sub>2</sub>开始新的一轮报数,A<sub>2</sub>报数“1”,A<sub>4</sub>报数“2”,A<sub>5</sub>报数“3”,所以A<sub>5</sub>出局。然后从A<sub>2</sub>开始新的一轮报数,A<sub>2</sub>报数“1”,A<sub>4</sub>报数“2”,A<sub>2</sub>报数“3”,所以A<sub>2</sub>出局。最后只剩下A<sub>4</sub>,他是最后一个人,所以他是胜利者。
这种游戏可以推广到任意n个人。当n个人围成圆圈时,每轮报数过程中,一共会出局n/3个人。最后只剩下的那个人是胜利者。这个问题也可以用数学的方法进行求解,但本质上是一个循环问题,每轮报数的规律是固定的,因此可以用循环操作进行求解。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)