关于约瑟夫问题pascal求解过程的问题

来源:百度知道 编辑:UC知道 时间:2024/05/09 12:22:42
百度百科里面有关于约瑟夫问题详细解答,其中有直接输出最后序号的pascal例程,但是其中的解法,我很疑惑,虽然他作了解答,不是太明白,
:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。
pascal
var n,m,i,s:integer;
begin
write('N M =');
read(n,m);
for i:=2 to n do
s:=(s+m) mod i;
writeln('The winner is ',s+1);
end.

其中,为什么是for i:=2 to n do
s:=(s+m) mod i;
求高手解答,详细点,加分不误,以示感谢!!!!!

你用少数几个人代入试试,慢慢理解。这个好像没什么解释的,就是这样,数论中的问题。一般用环链解决既省事又快速。

for i:=2 to n do 说明一共要使N-1个人出局,这里只要是循环N-1次就行, 没有什么意义.
s:=(s+m) mod i; 就是每次出局的人了

发现算法的答案好像不对
比如N=4,M=3
那么答案是1.

但是正确的答案应该是0

我编译器坏了,不能实践。

s初值为0,第一次循环后变为出局人的编号。
接下来每次循环都加上出局人的编号,最后胜出者就是s+1