问题描述:
这是一个非常经典的问题:设n个人围成一个圆圈,按一定的方向从第S个人开始报数,报到M为止,报数为M的人出列,然后从下一个人开始重新报数,报数为M的人又出列......直到所有的人全都出列为止。约瑟夫问题要对任意给定的N,S,M,求按出列次序得到的人员顺序表。
 
/* ==================================================== */
/* 程序名称: arrayList.c                                */
/* 程序目的: 用数组实现约瑟夫问题                       */
/* 程序作者: aimt ( computer 021 )                      */
/* ==================================================== */
#include<stdio.h>
#define size 100                    /* 输入人数的上限 */
void main()
{
 int person[size];
 int i, j;                        /* 循环修正变量 */
 int arrayLen;                    /* 数组长度 */
 int start, overNum;              /* 开始位置各跨过位置 */
 int deleNum;                     /* 出列人所在数组中的下标 */
 int name, total;                 /* 输入时,人的信息以及人的总数 */
 printf( "请输入圆桌上人的总数: " );
 scanf( "%d", &arrayLen ); printf( "\n" );
 if( ( arrayLen > size ) || ( arrayLen < 0 ) )
 {
  printf( "超出范围,请重新输入: " );
  scanf( "%d", &arrayLen ); printf( "\n" );
 };
 printf( "请输入各个人的信息(整数): \n" );
 for( i = 0; i < arrayLen; i++ )
 {
  scanf( "%d", &name );
  person[i] = name;
 }
 printf( "你输入的数据的顺序为: \n" );
 for( i = 0; i < arrayLen - 1; i++ )
  printf( " %d ==>", person[i] );
 printf( "%d \n", person[arrayLen - 1] );
 printf( "你打算从第几个人开始? 请输入开始号: " );
 scanf( "%d", &start );
 printf( "\n" );
 start = start - 1;
 printf( "请输入相邻两出列人之间的间隔: " );
 scanf( "%d", &overNum );
 printf( "\n" );
 
 total = arrayLen;
 printf( "程序运行后,出列人的顺序为:\n\n" );
 for( i = 0; i < total; i++ )                    /* 要打印total个人的情况,故做total次 */
 {
  if ( arrayLen == 1 )
   printf( "%d", person[0] );                    /* 如果是数组只剩一个元素,直接出列 */
  else
  {
   deleNum = ( start + overNum - 1 ) % arrayLen; /* 此取模保证循环 */
   printf( "%d ==> ", person[deleNum] );
   for ( j = deleNum; j < arrayLen; j++ )        /* 将出列元素后面的各元素前移 */
    person[j] = person[j+1];
   start = deleNum;
   arrayLen = arrayLen - 1;                      /* 移动完毕后,数组长度减1 */
  }
 }
 printf( "\n\n" );
}
 
从一本数据结构书上看到的用向量实现此问题:
void Josephus (Vector <int> &P, int n, int s, int m)
{
//将人员编号存入向量P;
int k = 1;
for(int i = 0; i<n, i++)
{P.Insert(k,i); k++;}
int s1 = s;
for(int j = n; j>=1; j--)
{
s1=(s1+m-1)%j;
if(s1== 0)   s1 = j;
int w = P.Getnode(s1 - 1);
P.Remvoe(s1 - 1);
P.Insert(w,n-1);
}
}