题目大意:
有n只猴子,编号1、2、···n围成一圈,从第一只猴子报数,报到m的猴子离开,然后剩下的猴子接着从1开始报数,直到剩下一只猴子,则剩下的猴子为大王
这里围成一圈报数,关键是怎么样模拟出一个圈,用队列可以很好的解决这个问题。先将前所有猴子的编号入队,然后将前m-1只分别出队和入队,在将第m只猴子出队,如此循环,直到剩下最后一只猴子。
using namespace std;
int main ()
{
int n,m;
if(m==0 && n==0)
break;
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
//编号初始化
a[i]=i;
head=1;tail=n+1;
while((tail-head)!=1)
{
for(j=1;j<=m-1;j++)
//前面的m-1个先出队然后进队
{
temp=a[head];
head++;
a[tail]=temp;
tail++;
}
head++;
//第m个直接越过
}
cout<<a[head]<<endl;
return 0;
}
题目分析:
题目代码:
#include
int i,j;
int a[100];
//存放猴子的编号
int head,tail;
//队列的头和尾
int temp;
while(cin>>n>>m)
{
}