题目描述:有n个小孩围成一圈,将他们从1开始依次编号,从编号为1的小孩开始报数,数到第m个小孩出列,然后从出列的下一个小孩重新开始报数,数到第m个小孩又出列,如此反复,直到所有小孩全部出列为止。
解:采用循环链表存放约瑟夫环,结点类型为:
struct Child
{
int no;
Child *next;
};
代码实现:
#include<iostream>
using namespace std;
struct Child
{
int no;
Child *next;
};
class Joseph
{
private:
int n,m;
Child *h;
public:
Joseph(int n1,int m1);
~Joseph(){}
void Jsequence();
};
Joseph::Joseph(int n1,int m1)
{
n=n1;m=m1;
h=new Child();
h->no=1;
h->next=h;
Child *p,*q;
p=h;
for(int i=2;i<=n;i++)
{
q=new Child();
q->no=i;
q->next=h;
p->next=q;
p=q;
}
}
void Joseph::Jsequence()
{
Child *q,*p;
p=h;q=p->next;
for(int i=2;i<=m && q!=p;i++)
{
if(i==m)
{
p->next=q->next;
cout<<q->no<<" ";
delete q;
q=p->next;
i=0;
}
else
{
p=p->next;
q=q->next;
}
}
//最后当只剩下一个结点时的特殊处理
cout<<q->no<<endl;
delete q;
}
int main()
{
int m,n;
while(1)
{
cout<<"Input n,m:"<<endl;
cin>>n>>m;
Joseph jse(n,m);
jse.Jsequence();
}
}