PASCAL 约瑟夫问题 麻烦大虾们把程序详细讲解一下(是用循环的,然后再发...
发布网友
发布时间:2024-10-22 07:18
我来回答
共5个回答
热心网友
时间:2024-10-22 08:28
{程序就是一个大循环,只要没有把人剔除完则继续循环。循环内部就是不断地把i指针向后推移,如果过了n就把指针移回1,如果当前i指向的这个人还没被剔除,则把他数进计数变量s,如果被剔除了(a[i]=True),则不数进计数变量。接着检测是否已经数到了第m个人(s=m),如果数到了则把计数变量赋值0,然后把a[i]:=True,表示这个人已被剔除,输出这个人的号码(i),再把被剔除的人数+1,否则继续循环。}
Program Josephus;
Var
n,m,s,f,i:Integer; {n表示有多少人,m表示每几人剔除一个,s表示现在已经数了几个人,f表示被剔除的人数,i是指向当前要检测的人}
a:Array[1..100]Of Boolean; {这个数组表示有哪个人被剔除了}
Begin
Readln(n,m); {读入n和m}
Repeat
Inc(i); {号码指针变量变量+1}
If i=n+1 Then {如果指针变量超界}
i:=1; {则将其赋值1}
If Not(a[i]) Then {如果a[i]没被剔除}
Inc(s); {则把计数变量+1,也就是把这个人数过}
If s=m Then {如果数到了第m个人}
Begin
s:=0; {则把数人变量赋值0}
Write(i,' '); {输出这个人的指针变量,也就是他的号码}
a[i]:=True; {把a[i]记录为已被剔除}
f:=f+1; {将剔除的人数变量+1}
End;
Until f=n; {当所有人被剔除则跳出循环,结束程序}
End.
热心网友
时间:2024-10-22 08:23
纯模拟
热心网友
时间:2024-10-22 08:26
用动归就OK了
热心网友
时间:2024-10-22 08:28
变题,数据量很大,用动归
热心网友
时间:2024-10-22 08:25
repeat
t:=t+1;
if t=n+1 then t:=1; // 一共有n个人的说,第n+1个人肯定是第一个人啦~~这是环,有木有~~~~
if a[t]=false then s:=s+1; // 这是在数数,有木有,false代表a[t]还木有出圈……
if s=m then // 呵呵~数到第m个了。话说这是模拟有木有~~~~
-------------
多说一句:话说,这个程序能不能编译成功是一个问题。
------修改一下-------
Program EX1;
var
n,m,s,f,t:integer;
a:array[1..100]of boolean;
begin
readln(n,m);
for t:=1 to n do
a[t]:=false;
f:=0; t:=0; s:=0;
repeat
t:=t+1;
if t=n+1 then t:=1;
if a[t]=false then s:=s+1;
if s=m then
begin
s:=0;
write(t,' ');
a[t]:=true;
f:=f+1;
end;
until f=n;
end.
-----------
以上。