問題描述:一堆猴子都有編號,編號是1,2,3 ...m,這羣猴子(n個)按照1-m的順序圍坐一圈,從第1開始數,每數到第m個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最後一隻猴子,則該猴子爲大王。
解決1:使用數組存放
#define Maxsize 1000
void jose(int n,int m)
{
int mon[Maxsize];
int i,d,count;
for (i=0;i<n;i++)
mon[i]=i+1;
cout<<"Befoue out:"<<endl;
for (i=0;i<n;i++)
cout<<mon[i]<<",";
cout<<endl;
cout<<"After out:"<<endl;
count=0;
i=-1;
//函數的實現
while(count<n)
{
d=0;
while(d<m)
{
i=(i+1)%n;
if (mon[i]!=0)
d++;
}
cout<<mon[i]<<",";
mon[i]=0;
count++;
}
cout<<endl;
}
解法二,使用循環鏈表
typedef struct LNode
{
int data;
struct LNode *link;
}LNode,*LinkList;
void jose(int n,int m)
{
LinkList p,pcur;
p=(LinkList)malloc(sizeof(LNode));
//第一隻猴子單獨拉出來了
p->data=1;
//循環單鏈表
p->link=p;
pcur=p;
for (int i=1;i<n;i++)
{
LinkList tmp=(LinkList)malloc(sizeof(LNode));
tmp->data=i+1;
tmp->link=pcur->link;
pcur->link=tmp;
pcur=tmp;
}
while(n--)
{
LinkList tmp;
for (int s=m-1;s--;tmp=p,p=p->link);
tmp->link=p->link;
cout<<p->data<<"->";
free(p);
p=tmp->link;
}
cout<<endl;
}