问题描述:约瑟夫环
有编号从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
;}