C++ 计算约瑟夫环算法

原创 2006年06月08日 18:06:00

#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;

}

相关文章推荐

C++ 约瑟夫算法实现

  • 2011年01月10日 12:10
  • 296KB
  • 下载

约瑟夫环 算法

  • 2015年04月24日 10:23
  • 236KB
  • 下载

C++[算法]用数组模拟约瑟夫问题,即 N个人围成一圈,顺时针每数到给定K值的人出列,直到剩下最后一个人,求出圈人的序号顺序

#include using std::cin; using std::cout; using std::endl; int main() { unsigned int uiMenCou...

约瑟夫环问题算法

  • 2013年03月23日 23:05
  • 24KB
  • 下载

约瑟夫环算法

  • 2008年05月25日 10:08
  • 714B
  • 下载

(算法)约瑟夫环问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;...

约瑟夫环算法

  • 2017年04月26日 15:44
  • 27KB
  • 下载

算法之约瑟夫环

  • 2012年06月25日 16:51
  • 50KB
  • 下载

约瑟夫环的一个简单算法

前些天看到了一个常见的算法题,约瑟夫环问题。        约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到k的那个人出列...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 计算约瑟夫环算法
举报原因:
原因补充:

(最多只允许输入30个字)