Joseph数的实现

1、  问题

对于有n个人,每个人的编号唯一并且都是从1n。现在指定一个人为起始位置,开始报数,当报到m时,报数为m的人退出。然后从退出的那个人的下一个开始从新报数……循环这个过程,指定n个人都退出位置。

2、  思想

对每个人都设置一个标记为,初始化时,标记为0,对于离开的人,表记为1;每次都遍历,直到找到第m个人,他的flag标记为0;然后置这个人的flag1

3、  代码实现

void joseph3(int *array,int len,int step,int start)

{

         /************************************************************************/

         /* start起始位置:12,3...n

          *step:每次要报数的人数,例如5,那么从1 开始报数,那么报到5时,该人退出。

          */

         /************************************************************************/

         int i=0,count=0;

         int *flag=new int[len];

        

        

         for(i=0;i<len;i++)

         {

                   flag[i]=0;

         }

         cout<<endl;

         int k=0;

         int cur_pos=(start-1+step-1)%len;//start>=1,step>=1

         while(count<len)

         {

                   cout<<array[cur_pos]<<" ";

                   flag[cur_pos]=1;

                  count++;

                   //cur_pos++;

                   k=0;

                   while(k<step&&count<len)

                   {

                            cur_pos=(cur_pos+1)%len;

                            if(flag[cur_pos]==0)

                            {

                                     ++k;

                            }

                   }

         }

         cout<<endl;

         delete[] flag;

}

void test_joseph()

{

         int len=10;

         int *array=new int[len];

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

         {

                   array[i]=i+1;

                   cout<<array[i]<<" ";

         }

         cout<<endl;

         joseph3(array,len,5,1);

}