題目大意:
有n只猴子,編號1、2、···n圍成一圈,從第一隻猴子報數,報到m的猴子離開,然後剩下的猴子接着從1開始報數,直到剩下一隻猴子,則剩下的猴子爲大王
題目分析:
這裏圍成一圈報數,關鍵是怎麼樣模擬出一個圈,用隊列可以很好的解決這個問題。先將前所有猴子的編號入隊,然後將前m-1只分別出隊和入隊,在將第m只猴子出隊,如此循環,直到剩下最後一隻猴子。
題目代碼:
#include
using namespace std;
int main ()
{
int
n,m;
int i,j;
int a[100];
//存放猴子的編號
int head,tail;
//隊列的頭和尾
int temp;
while(cin>>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;
}