问题描述 | 要从n只猴子中选出一位大王。它们决定使用下面的方法: n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。 |
输入形式 | 控制台输入三个整数n,m,q |
输出形式 | 输出最后选为大王的猴子编号 |
样例输入 | 7 4 3 |
样例输出 | 4 |
样例说明 | 输入整数n = 7,m = 4,n = 3,输出4 |
解题思路:每一次循环后,退出猴子后的数组依次前移一个位置
#include<stdio.h>
int main()
{
int i,n,m,q,a[10000],j;
scanf("%d%d%d",&n,&m,&q);
for(i=1;i<=n;i++)
a[i]=i;
for(i=1;i<=n-1;i++)
{
q=q+m-1;
if(q>=n-i+2&&q<2*(n-i+2)-1)
q=q-(n-i+1);
else if(q>=2*(n-i+2)-1)
{
int k=(q-1)/(n-i+1);
q=q-k*(n-i+1);
}
for(j=q;j<=n-i+1;j++)
a[j]=a[j+1];//将退出的猴子覆盖,后面的依次前移一位
if(q==n-i+1)
q=1;
}
printf("%d",a[1]);
return 0;
}