//第三题约瑟夫环问题
#include <iostream.h>
class YosfMember //约瑟夫环中的每个人
{
public:
int data; //存放每个人手中的密码
int next; //存放每人下一个人的号码,即指向的下一个人
};
class Yosf
{
private:
int n, ptrP, ptrQ, m;
YosfMember* f;
public:
Yosf(){
cout<<endl<<"请输入组成约瑟夫环的人数:";
cin>>n;
f = new YosfMember[n];
ptrP = 1;
ptrQ = 0;
for (int i=1; i<=n; i++)
f[i].data = i;
for (i=1; i<n; i++)
f[i].next = i+1;
f[n].next = 1;
}; //构造函数初始化
void ptrMoveOn(){
ptrQ = ptrP;
ptrP = f[ptrP].next;
}; //指针向前移动一位
void GetYosf(){
cout<<"请输入首次的报数值:";
cin>>m;
if (m == 1)
ptrQ = n;
for (int j=1; j<=n; j++)
{
m--; //从当前这个人开始报数
for (int i=1; i<=m; i++) ptrMoveOn();
m = f[ptrP].data;
cout<<m<<" ";
f[ptrQ].next = f[ptrP].next; //删除ptrP所指向的那个人
ptrP = f[ptrP].next;
}
cout<<endl<<endl;
}; //获得约瑟夫环序列
};
void main(){ //执行约瑟夫环
Yosf* aYosf = new Yosf();
aYosf->GetYosf();
delete aYosf;
}