C++ 计算约瑟夫环算法

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

#include <iostream>

using namespace std;

<?xml:namespace prefix = o />

 

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++实现很经典的做法

原文地址:http://www.cnblogs.com/hanxi/archive/2012/10/10/2718413.html /* *******循环链表解决约瑟夫环问题******* * 问...
  • jzh1988903
  • jzh1988903
  • 2014年10月07日 14:52
  • 2321

C++第15周项目3 -约瑟夫环

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijia...
  • sxhelijian
  • sxhelijian
  • 2013年06月08日 07:22
  • 6877

C++经典题目:约瑟夫环问题

问题描述: 有n个人围成一圈,顺序排号。从第一个人开始报数(1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。 分析: 首先由用户输入人数n,然后对这n个人进行编号【因为如果不编号的话...
  • QianShouYuZhiBo
  • QianShouYuZhiBo
  • 2013年09月26日 23:48
  • 3009

约瑟夫环(数学高效率解法,很详细)

 5.5.4 用数学方法解约瑟夫环(1) 原文copy:http://book.51cto.com/art/201403/433941.htm 5.5.4  用数学方法解约瑟夫环(1...
  • qq_25973267
  • qq_25973267
  • 2015年12月25日 22:49
  • 4661

C++面向对象方法求解约瑟夫环问题

约瑟夫问题有很多种解法及其变种,这里的约瑟夫环问题是这样的: [b]约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数...
  • u010155023
  • u010155023
  • 2015年02月14日 12:39
  • 1039

数据结构 约瑟夫环问题C++

需求分析 本程序是用VC编写,由于约瑟夫问题是n个人围坐在一圈,所以采用循环链表实现,又由于报数时可能循环到开始,所以采用不带头结点的循环链表结构。 题目要求的约瑟夫环操作:编号是1,2,……...
  • thf9527
  • thf9527
  • 2016年02月18日 15:41
  • 1691

【算法设计】约瑟夫环

本科系列课程参见:《软件学院那些课》 问题描述 约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限...
  • xiaowei_cqu
  • xiaowei_cqu
  • 2013年02月21日 14:20
  • 8428

c++循环列表解决约瑟夫环问题

约瑟夫环问题: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到...
  • u011200403
  • u011200403
  • 2017年02月16日 21:42
  • 394

C语言经典算法100例-069-简单约瑟夫环问题

这里我们实现一个简单的约瑟夫环问题,描述如下: 有N个人站成一圈,从
  • mrbourne
  • mrbourne
  • 2014年05月07日 09:24
  • 1453

约瑟夫环(C++单项循环链表)

约瑟夫问题的一种描述是:          编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报...
  • changgui5211
  • changgui5211
  • 2015年07月30日 15:19
  • 2908
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 计算约瑟夫环算法
举报原因:
原因补充:

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