数组实现约瑟夫环
/*
任务:
一群小孩围成一圈,任意假定一个数m,从第一个小孩起,顺时针方向数,每数到第m个小孩时,该小孩便离开。
小孩不断离开,圈子不断缩小。最后剩下的一个小孩便是胜者。求胜者的编号?
要求
以面向对象技术进行程序设计
建立环状链表类
程序便于维护与扩张:如易于对小孩数量n和数数间隔m进行变化
改变获胜者数量,使其可设为任意值
可中途增加小孩人数
将数据结构改为数组形式存放,要求尽可能少地修改程序并能够实现上述功能,保留原环链表的实现方式
*/
//类的实现
#include<iostream>
using namespace std;
typedef char ElemType;
#define maxNum 100
class Huan
{
public:
void setNumber();
void creat_List();
void insert();
void deal();
private:
int number;//多少人
int number1;//该数时有人退出
int winnum;//请输入赢家人数
int length;
ElemType *data;
};
void Huan::setNumber()
{
cout<<"请输入有多少人:"<<endl;
cin>>number;
cout<<"请输入一个数表示数到该数时有人退出:"<<endl;
cin>>number1;
cout<<"请输入赢家人数:"<<endl;
cin>>winnum;
}
void Huan::creat_List()
{
length=0;
data=new ElemType[maxNum];
cout<<"请输入相应数据"<<endl;
for(int i=0;i<number;i++)
cin>>data[length++];
}
void Huan::deal()
{
int tag=0;
char choice;
int peopleNum;
int i=0;
while(number>winnum)
{
if(data[i]!='#')
tag++;
if(tag==number1)
{
tag=0;
number--;
data[i]='#';
cout<<"剩余人数的数据为"<<endl;
int con=0;
while(con<length)
{
if(data[con]!='#')
cout<<data[con]<<'\t';
con++;
}
cout<<endl;
cout<<"是否有人插入(Y),人数的个数"<<endl;
cin>>choice>>peopleNum;
if(choice=='Y')
{
for(int k=0;k<peopleNum;k++)
{
cin>>data[length++];
number++;
cout<<"剩余人数的数据为"<<endl;
int con=0;
while(con<length)
{
if(data[con]!='#')
cout<<data[con]<<'\t';
con++;
}
cout<<endl;
}
}
}
i++;
if(i==length)
i=0;
}
cout<<"赢家的数据为:"<<endl;
int times=0;
while(times<length)
{
if(data[times]!='#')
cout<<data[times]<<'\t';
times++;
}
cout<<endl;
}
void main()
{
Huan xin;
xin.setNumber();
xin.creat_List();
xin.deal();
}