c语言用递归解决约瑟夫环问题,求出列顺序

如题所述

第1个回答  推荐于2017-12-15
思路:
当有n个人的时候,他们的编号依次是0、1、2、3、4、………、n-1。假设最后编号为x(n)的人会留下来。
因为数到m的那个人会出列,那么此轮中编号为(m-1)%n的人会出列,编号为(m+0)%n的人将做为下一轮编号为0的人,此轮编号为(m+i)%n的人将做为下一轮编号为i的人…
因此当有n-1个人的时候,编号为i的人对应着上一轮编号为(m+i)%n的人。假设此轮编号为x(n-1)的人最终会留下来。因为编号为x(n-1)的人肯定对应着上一轮的x(n),所以有x(n)=(m+x(n-1))%n。
有了这个递推公式,那我们就可以一直递推到x(2)=(m+x(1))%2,而x(1)=0。
所以我们可以这么来写这个函数:j = 0
for i 从 2 到 n
j = (m+j)%i最终第j个人会留下来(如果从1开始编号就是第j+1个人最终会留下来)
代码
int fun(int n, int m)
{
int i, r = 0;
for (i = 2; i <= n; i++)
r = (r + m) % i;
return r+1;
}
main(){
int m,n;
scanf("%d%d",&m,&n);
printf("%d",fun(m,n));
}本回答被网友采纳
相似回答