数组实现约瑟夫环

/*

任务:

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

   

   

}

posted @ 2012-11-24 12:12  ♂咱說 ろ算  阅读(258)  评论(0编辑  收藏  举报