要从n只猴子中选出一位大王。它们决定使用下面的方法: n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。 【输入形式】 控制台输入三个整数n,m,q。 【输出形式】 输出最后选为大王的猴子编号。C语言
时间: 2023-12-10 22:41:03 浏览: 126
以下是C语言的代码实现:
```c
#include <stdio.h>
int main()
{
int n, m, q;
scanf("%d %d %d", &n, &m, &q);
int i, j, k;
int a[100]; // 用数组模拟猴子围成的圈
for(i = 0; i < n; i++)
a[i] = i + 1;
i = q - 1;
while(n > 1)
{
j = (i + m - 1) % n; // 计算出要删除的猴子在数组中的下标
for(k = j; k < n - 1; k++)
a[k] = a[k + 1]; // 将后面的猴子向前移动
n--; // 猴子总数减1
i = j; // 下一次从删除的猴子的下一只开始报数
}
printf("%d\n", a[0]); // 剩下最后一只猴子就是大王
return 0;
}
```
其中,数组`a`模拟猴子围成的圈,数组下标从0到n-1,所以猴子的编号为下标加1。变量`i`表示当前开始报数的猴子在数组中的下标。变量`j`表示报到m的猴子在数组中的下标。当找到报到m的猴子后,将其从数组中删除,同时将后面的猴子向前移动一个位置。最后剩下最后一只猴子就是大王,输出其编号即可。
相关问题
要从n只猴子中选出一位大王。它们决定使用下面的方法:\nn只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至
最后只剩下一只猴子为止,这只猴子就是大王。请问,最后当选的大王是第几只猴子?
这是一个经典的约瑟夫问题,可以用数学归纳法证明,最后当选的大王编号为:
f(n,m) = (f(n-1,m)+m) % n
其中,f(n,m)表示n只猴子中最后当选的大王编号,m表示报数到m的猴子退出竞选。当n=1时,f(n,m)=0,即只有一只猴子时,它就是大王。
例如,当n=5,m=3时,最后当选的大王编号为:
f(5,3) = (f(4,3)+3) % 5 = ((f(3,3)+3)+3) % 5 = (((f(2,3)+3)+3)+3) % 5 = ((((f(1,3)+3)+3)+3)+3) % 5 = (((0+3)+3)+3)+3) % 5 = 3
因此,最后当选的大王是第3只猴子。
有n只猴子围成一圈,编号为1-n,打算从中选出一个大王。经过协商,决定选大王的规则如下:从第一只猴子开始循环报数,数到k的猴子出圈,然后从下一只猴子继续报数出圈......最后剩下来的那只猴子就是大王
这是一道经典的约瑟夫问题,可以用数学方法来解决。假设最后剩下的猴子编号为f(n,k),则有递归公式f(n,k)=[f(n-1,k)+k]%n,其中%表示模运算,当 n=1 时,f(n,k)=0。因此,可以使用递归或循环来实现这个算法,最终得到剩下来的猴子编号。
阅读全文