C++ 计算约瑟夫环算法

#include <iostream>

using namespace std;

 

class YsfRing

{

public:

              YsfRing(int length);

              void Resolve(int firstStep);         // 求约瑟夫环

              void MoveOneStep(int& index);  // 移动一个步长

              void DisplayResult();              // 显示结果

              ~YsfRing();

private:

              int m_Length;                   // 环的长度

              int *m_Ring;                                  // 保存初始环

              int *m_Result;                  // 保存约瑟夫环的结果

};

 

YsfRing::YsfRing(int length)

{

        // 初始化环的各项数值

              m_Ring   = new int[length];

              m_Result = new int[length];

              memset(m_Ring  , 0 , sizeof(int)*length);

              memset(m_Result, 0 , sizeof(int)*length);

              m_Length = length;

              for(int i=0 ; i<m_Length;i++)

              {

                            m_Ring[i] = i+1;

              }

}

 

void YsfRing::DisplayResult()

{

        // 显示结果

              for(int i=0 ; i<m_Length;i++)

              {

                            cout<<m_Result[i]<<" ";

              }

              cout<<endl;

}

 

void YsfRing::Resolve(int firstStep)

{

        // 计算约瑟夫环

              int count = this->m_Length ;

              int resultIndex = 0;

              int index = 0 ;

              int step = firstStep;

              while( count > 0 )

              {

                // 移动相应的步长,找到下一个没有被移走的元素

                            for(int k=0;k<step;k++)

                            {

                                          MoveOneStep(index);

                            }

                // 将当前的元素保存在结果数组里面

                            m_Result[resultIndex++] = step = m_Ring[index];

                // 移走当前的元素

                            m_Ring[index] = -1;

                // 元素总数减一

                            count --;

              }

}

 

void YsfRing::MoveOneStep(int& index)

{

              do

              {

                            // 找到下一个元素

                            index ++;

                          // 如果到环尾,再跳回环头

                            if(index >= this->m_Length)

                            {

                                          index =0;

                            }

              }while(m_Ring[index] < 0 );

}

 

YsfRing::~YsfRing()

{

              delete [] m_Ring;

              delete [] m_Result;

}

 

int main()

{

              YsfRing *ring = new YsfRing(10);

              ring->Resolve(7);

              ring->DisplayResult();

              delete ring;

              return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值