Josephus环形排列问题

题目:设n个人围坐在一圆桌周围,依次编号为1,2,...,n,从第s个人从1开始依次报数,数到m的人出列,然后从出列的下一个人重新开始报数,数到m的人又出列,…,如此反复直到只剩一人为止为止。对于任意给定的n,s和m,输出按出列次序得到的n个人员的序列。

代码如下:

#include<stdio.h>int a[100];

void dele(int x,int t)        //定义数组删除元素函数

{

     int j;

     if(x==t)

          a[x]=0;

     for(j=x;j<=t;j++)

     {

          a[j]=a[j+1];

          a[t+1]=0;

     }

}

void jose(int n,int m)

{

     int i,len,cycle;  //len表示当前数组的长度,cycle表示当前报数人报出的数。

     for(i=1;i<=n;i++)

          a[i]=i;

     cycle=1;

     len=n;

     i=1;

     while(len>1)

     {

            if(i>len)

          {

               i=0;

                  cycle--;

          }

          if(cycle==m)

          {

               dele(i,len);

               len--;

                  if(i>len)   //删除当前元素后,当前位置已经没有元素。

                  {

                       cycle=0;

                  }

                  else

                  {

                       cycle=1;

                  }

          }

          i++;

          cycle++;



     }

}

int main()

{

     int s1,s2;

     scanf("%d %d",&s1,&s2);

     if(s1>0&&s2>0)

     {

         if(s2==1)

         printf("%d\n",s1);

else if(s2>1)

{

          jose(s1,s2);

     printf("%d\n",a[1]);

}

     scanf("%d %d",&s1,&s2);

     }

     return 0;

}

  

你可能感兴趣的:(OS)