约瑟夫环问题有三种常见的解决方法,一是数组模拟,二是链表模拟,三是运用数学算法解决(不需要输出数列的情况下)
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <vector>
#include <list>
#include <math.h>
#include <algorithm>
using namespace std;
void josephus1(int n, int m)//数组模拟实现
{
int monkey[302];
int i, nCount, p;
for( i = 0 ; i <= n ; i++ )
monkey[i] = 1;
nCount = n ;
i = 1;
p = 1;
while( nCount > 1 )
{
if( monkey[i]==1 )
{
if( p == m )//找到要出局的编号
{
monkey[i] = 0;
p = 1 ;
nCount-- ;
}
else
p++;
}
i++;
if( i > n) i = 1;
}
for( i = 1 ; i <= n ; i++ )
if(monkey[i] == 1)printf("%d\n",i);
return;
}
void josephus2(int n, int m)//数学递归实现
{
int i, f ;
f = 0;
for( i = 2 ; i<= n ; i++ )
{
f = ( f + m ) % i ;
}
printf("%d\n",f+1);
}
int main()
{
int n, m;
while( scanf("%d %d",&n,&m) && n!=0 && m!=0 )
{
//josephus1(n,m);//数组模拟实现
josephus2(n,m);//数学递归实现
}
return 1;
}
不管用数组还是链表,时间复杂度都是O(mn),如果不需要输出出队的序列,可以考虑用数学公式递归实现,原理见 博文。