您的位置:首页 > 其它

数组实现约瑟夫环

2012-11-24 12:12 309 查看
/*

任务:

一群小孩围成一圈,任意假定一个数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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: