约瑟夫环的问题,急!

来源:百度知道 编辑:UC知道 时间:2024/06/11 04:21:38
帮忙解释下这段程序的意思,谢谢了
void Josegh(void)
{ int i,j;
int s1,w;
s1=s;
for(i=1;i<=n;i++)
p[i-1]=i;
for(i=n;i>=2;i--)
{ s1=(s1+m-1)%i;
if(s1==0)
s1=i;
w=p[s1-1];
for(j=s1;j<=i-1;j++)
p[j-1]=p[j];
p[i-1]=w;
}
}
请问,其中的s1=(s1+m-1)为什么要减一呢?
那你能再举一些别的方法吗?我正准备计算机三级呢。呵呵。我会再加二十分的:)如果回答的好的话:)

因为是从自身位置开始算起的第m个索引值,所以要减一

首先要懂得josegh环的游戏规则,上述代码的思想是依次把要出环的元素放到数组的尾部,每次循环后只递减环的范围,举个例子,初始环是{1,2,3,4,5,6,7},n=7,令初始位置s=1,每次数到m=3的元素出环,第一次循环后元素3出环,数组元素变为{1,2,4,5,6,7,3}将3放到数组尾部,下次循环将只考虑前n-1即6个元素的环并作处理,s1=(s1+m-1)%是为了在既定的元素范围内找到哪一个元素要出环,得到其索引~为什么减一结合例子就很清楚了
上述代码思想就是这样,其实还有其他的解法,琢磨一下吧

这个用链表很容易呀