一群猴子要选大王,遴选的方法是:让M只候选猴子围成一圈,从某位置起顺序编号为0∼M−1号。从第0号开始报N个数字,每轮从0报到N−1,凡报到N−1的猴子即退出候选,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。问猴王是原来第几号猴子? 输入格式: 在一行中输入两个整数M和N,分别代表猴群数量和报数数。整数与整数之间用空格间隔。 输出格式: 在一行中输出一个数,表示当选猴子编号。 输入样例: 9 2 输出样例: 2用C语言怎么写
时间: 2023-06-19 07:05:20 浏览: 91
以下是C语言的代码实现:
```c
#include <stdio.h>
int main()
{
int m, n, ans = 0;
scanf("%d%d", &m, &n);
for (int i = 2; i <= m; i++)
ans = (ans + n) % i;
printf("%d\n", ans);
return 0;
}
```
思路解析:
使用一个变量ans表示当前轮数的猴子编号。每次循环时,将ans加上报数数n,然后对猴子总数i取余,即ans = (ans + n) % i。最后剩下的一只猴子就是猴王,因此输出ans即可。注意循环从2开始,因为第一轮时ans初始值为0,第二轮时从1开始报数。
相关问题
一群猴子要选大王,遴选的方法是:让m只候选猴子围成一圈,从某位置起顺序编号为0
然后,从第一个猴子开始报数,每次报到n的猴子出列,剩下的猴子继续按顺序报数。如此循环,直到只剩下一只猴子为止,该猴子即为大王。
首先我们需要明确几个变量的含义:猴子的总数为m,每次报数到第n只猴子出列,最后剩下的那只猴子的编号为x。
我们可以使用循环来模拟猴子选大王的过程。首先创建一个长度为m的数组,用来存放猴子的编号。然后从第一个猴子开始报数,每次报数到第n只猴子,就将该猴子的编号从数组中移除。重复这个过程,直到数组中只剩下一只猴子。最后剩下的那只猴子的编号即为x。
具体的实现步骤如下:
1. 创建一个长度为m的数组,保存猴子的编号,编号范围为0到m-1。
2. 初始化报数的位置为0,即从数组的第一个元素开始报数。
3. 使用一个循环,每轮循环从当前位置开始报数,报数到第n只猴子,移除该猴子的编号。
4. 更新当前位置,使其指向下一个猴子。
5. 当数组中只剩下一个元素时,循环结束,该元素即为大王的编号x。
6. 返回大王的编号x。
例如,当猴子总数m为5,报数的位置n为3时:
1. 创建数组[0, 1, 2, 3, 4]。
2. 从0位置开始报数,报数到第3只猴子,移除编号为2的猴子。
3. 数组变为[0, 1, 3, 4],当前位置更新为3。
4. 从3位置开始报数,报数到第3只猴子,移除编号为4的猴子。
5. 数组变为[0, 1, 3],当前位置更新为0。
6. 从0位置开始报数,报数到第3只猴子,移除编号为0的猴子。
7. 数组变为[1, 3],当前位置更新为1。
8. 从1位置开始报数,报数到第3只猴子,移除编号为3的猴子。
9. 数组变为[1],当前位置更新为0。
10. 数组中只剩下一个元素,循环结束,大王的编号为1。
因此,当猴子总数m为5,报数位置n为3时,选出的大王编号为1。
一群猴子要选大王,遴选的方法是:让m只候选猴子围成一圈,从某位置起顺序编号为0∼m−1号。从第0号开始报n个数字,每轮从0报到n−1,凡报到n−1的猴子即退出候选,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。问猴王是原来第几号猴子?
### 回答1:
这是一个关于选择大王的问题。选择的方法是让m只猴子围成一个圈,从某位置起顺序编号为0~m-1。从编号为0的位置开始报n个数字,每轮报到n-1的猴子退出,直到只剩下一只猴子时即为选择的猴王。接着从紧邻被删除的下一只猴子开始按同样的方式继续报数,直到只剩下一只猴子。询问的是猴王是原来第几号猴子。
### 回答2:
这是一个经典的约瑟夫问题,可以用数学归纳法来证明猴王是原来第$(m-1)\bmod n$号猴子。
首先考虑$m=1$的情况,此时只有一只猴子,那么它就是猴王,编号为0,符合结论。
接着考虑$m>1$的情况,假设$m-1$只猴子中选出的猴王的编号是$k$,我们需要证明从这$m-1$只猴子中再加入一只猴子后,选出的猴王的编号是$(k+n)\bmod m$。
首先进行报数的时候,相当于从$k$开始,报到$(k+n-1)\bmod(m-1)$的猴子出圈,它的编号是$(k+n-1)\bmod(m-1)$,此时编号大于等于$k$的猴子编号要加1。
然后从$(k+n)\bmod(m-1)$开始重新报数,这时编号小于$k$的猴子编号不变,其他猴子的编号要加1。这个过程中,我们可以把原来的猴子编号看做是$(k+0)\bmod(m-1)$到$(k+m-2)\bmod(m-1)$,只需找到新加入的猴子在这个序列中的位置即可得到猴王的新编号。
设$(k+n)\bmod(m-1)=p$,则新加入的猴子编号为$p$,根据定义可以得到它在第一轮游戏中被淘汰。此时还剩下$m-2$只猴子,猴王的编号是$k$,根据归纳假设,选出的猴王的编号是$(k+n)\bmod(m-1)$,即$p$。所以最后选出的猴王的编号就是$p=(k+n)\bmod m$,证毕。
### 回答3:
这是一道经典的约瑟夫环问题。我们可以使用递推的方法解决。
我们定义f(i)表示i只猴子中最后留下的猴子的编号。那么最终的答案即为f(m)。
首先,当只有一只猴子时,它就是猴王,即f(1)=0。
然后,我们考虑有i只猴子时最后留下的是哪一只猴子。我们可以把它们依次编号为0 ~ i-1。考虑在i只猴子中,最后退出的猴子编号为x,那么在i+1只猴子中,最后退出的猴子编号一定为(x+n)%i+1,即在i只猴子中往后数n次的猴子在i+1只猴子中的编号。
因此,我们可以得到递推公式:
f(1) = 0
f(i) = (f(i-1) + n) % i, i > 1
最终的答案即为f(m)。
例如,当m=5,n=3时,我们可以递推得到:
f(1) = 0
f(2) = (f(1) + 3) % 2 = 1
f(3) = (f(2) + 3) % 3 = 1
f(4) = (f(3) + 3) % 4 = 0
f(5) = (f(4) + 3) % 5 = 4
因此,最后留下的猴子是原来第4只猴子。