解答约瑟夫环问题的几个方法

    技术2022-05-12  24

    问题描述:约瑟夫环  有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始,  如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。 常规的解法,简单描述一下,就不写算法了.用所有的元素生成一个循环链表,第一次从第一个向前走M步,将当前元素分离出链表,然后从下一个元素开始走M步,再将当前元素分离出链表,重复以上过程,直到链表中只有一个元素时即为所求. 递归的解法: int  f( int  n,  int  m){   if  (n  >   1 )    return (m  +  f(n  -   1 , m)) % m;   else     return  0 ;} 非递归的解法,很巧妙: int  f( int  n,  int  m){     int  i, r  =   0 ;     for  (i  =   2 ; i  <=  n; i ++ )        r  =  (r  +  m) % i;    return r + 1 ;}  

    最新回复(0)