/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:Annpion.cpp
*作者:王耀鹏
*完成日期:2015年6月1日
*版本号:v1.0
*
*问题描述:n个小孩子围成一圈,从第一个小孩子开始顺时针方向数数字,到第m个小孩子离开,这样反反复复,最终只剩下一个小孩子,求第几个小孩子留下?
*输入描述:无。
*输出描述:输出出局小孩的号数以及留下小孩的号数。
*/
#include<iostream>
using namespace std;
//链表结点kid,其中number为这个人的编号
struct kid
{
int number;
kid *next;
};
//约瑟夫环类
class joseph_ring
{
private:
int n;//用于存放人数
int m;//用于存放初始密码
kid *head;//链表的头结点,初始化时指向1号孩子
public:
joseph_ring(int nn, int mm);//创建nn个孩子,间隔为mm的约瑟夫环
~joseph_ring();
void show();//运算并输出的成员函数
};
//定义joseph_ring类中的成员函数
joseph_ring::joseph_ring(int nn,int mm):n(nn),m(mm)
{
kid *p1,*p2;
for(int i=1; i<=n; ++i)
{
p1=new kid ;
p1->number=i;
if(i==1)
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
}
p2->next=head;
}
joseph_ring::~joseph_ring()
{
delete head;
head=NULL;
}
void joseph_ring::show()
{
kid *p1,*p2;
p1=head;
int j=m;
while(p1)
{
--j;
if(j==0)
{
p2->next=p1->next;
p2=p1;
p1=p2->next;
cout<<"The out kid of number:"<<p2->number<<endl;
delete p2;
--n;
j=m;
if(n==1)
{
head=p1;
cout<<"The last kid of number is No "<<head->number<<endl;
break;
}
}
else
{
p2=p1;
p1=p2->next;
}
}
}
int main()
{
int n,m;
cout<<"n=";
cin>>n;
cout<<"m=";
cin>>m;
joseph_ring j(n,m);
j.show();
return 0;
}
运行结果: