题目:
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到m,凡报到m的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给两个正整数n,m(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
队列:
#include<iostream>
#include<queue>
using namespace std;
int main ()
{
int n,m;
cin>>n>>m;
queue<int>q;
int i;
for (i=0;i<n;i++)
{
q.push(i+1);
}
i=1;
while (q.size()!=1)
{
if (i%m!=0)
{
q.push(q.front());
q.pop();
}
else
{
q.pop();
}
i++;
}
cout<<q.front();
return 0;
}
递归:
#include <stdio.h>
#include <stdlib.h>
int yue(int n,int m)
{
int y;
if(n==1){
y = 0;
}else if(n>1){
y = (yue(n-1,m)+m)%n;//当n>1时开始递归
}
return y;
}
int main()
{
int n,y;
int m ;
scanf("%d%d",&n,&m);
//3次一循环
y = yue(n,m)+1;//题目是从1开始,因此需要+1
printf("%d",y);
return 0;
}