一群猴子要选新猴王。新猴王的选择方法是:让n只候选猴子围成一圈,从某位置起顺序编号为1~n号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
时间: 2023-05-31 12:17:51 浏览: 365
c++实现猴子选大王
### 回答1:
选新猴王的方法是:让n只候选猴子围成一圈,从某位置起顺序编号为1~n号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
### 回答2:
这道题其实就是经典的约瑟夫问题。我们可以使用数学的方法来解决这个问题。
首先,我们可以定义一个f函数:f(n,m)表示n个人围成一圈,每报m次数的人出局,最后剩下的那个人的编号。因为我们要求的是最后剩下的那个人的编号,所以可以得到f(n,m) = (f(n-1,m)+m)%n (n>1),然后递归调用f函数即可。
那么针对这道题,我们可以把n设置为题目中的n只猴子的个数,m设置为3,然后依次调用f函数即可得到最后留下来的猴子的编号。
具体实现方式可以使用递归或者迭代的方式来完成,下面给出一个Python3的递归实现代码:
```python
def f(n, m):
if n == 1:
return 0
return (f(n-1, m)+m) % n
n = int(input("请输入猴子个数:"))
winner = f(n, 3)
print("猴王编号为:", winner+1)
```
在这个代码中,我们用input函数来获取用户输入的猴子个数n,然后调用f函数来计算最后的猴王的编号,并输出结果。
需要注意的是,因为题目中猴子的编号从1开始,而计算过程中用到的是序号,需要把最终的结果加1才能得到正确的猴王编号。
### 回答3:
这道题是著名的“约瑟夫问题”,是一个经典的递推问题。下面是具体的解法:
首先可以算出第一轮被淘汰的猴子是3号猴子。因为1、2号猴子都没被淘汰,所以下一轮从4号猴子开始报数。此时因为3号猴子已经不在圈里了,所以相当于从剩下的猴子中重新开始编号,即4号猴子变成了1号猴子。接下来将 1~n-1 号猴子重新编号为 1~n-2 号,即每个猴子编号减 1,这样就可以将问题转化为 n-1 只猴子时的情况。以此类推,直到只剩下 1 只猴子,那么这只猴子就是当选的猴王了。
所以假设最初有 n 只猴子,选出的猴王编号为 f(n)。根据上面的分析,可以得到递推关系式:
f(1) = 1
f(n) = (f(n-1) + 2) % n + 1
其中 % 表示取余运算。利用这个递推式,可以很方便地求出当选猴王的编号。例如当 n=7 时,按照递推式得到:
f(1) = 1
f(2) = (f(1) + 2) % 2 + 1 = 2
f(3) = (f(2) + 2) % 3 + 1 = 3
f(4) = (f(3) + 2) % 4 + 1 = 2
f(5) = (f(4) + 2) % 5 + 1 = 5
f(6) = (f(5) + 2) % 6 + 1 = 4
f(7) = (f(6) + 2) % 7 + 1 = 7
因此当选猴王的编号为 7。
阅读全文