6.1例题--约瑟夫问题--2746

来源:互联网 发布:java job quartz 编辑:程序博客网 时间:2024/06/03 20:50

约瑟夫环问题有三种常见的解决方法,一是数组模拟,二是链表模拟,三是运用数学算法解决(不需要输出数列的情况下)

#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-- ;}elsep++;}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),如果不需要输出出队的序列,可以考虑用数学公式递归实现,原理见博文。


原创粉丝点击