PASCAL语句中的一个问题,麻烦知道的帮下忙

来源:百度知道 编辑:UC知道 时间:2024/06/24 19:04:28
program project26;
const
n=200;
var
si,pr:set of 2..n;
x,j,m:integer;
begin
writeln('please input m:');
readln(m);
si:=[2..m];
pr:=[ ];
x:=2;
repeat
while not(x in si) do x:=succ(x);
pr:=pr+[x];
j:=x;
while j<=m do
begin
si:=si-[j];
j:=j+x;
end;
until si=[ ];
j:=0;
for x:=2 to m do
if x in pr
then begin
write(x:5);
inc(j);
if j mod 10 =0 then writeln;
end;
writeln
end.

中的 repeat
while not(x in si) do x:=succ(x);
pr:=pr+[x];
j:=x;
while j<=m do
begin
si:=si-[j];
j:=j+x;
end;
until si=[ ];
这一部分没有懂,本人初学者,无奈作业必须完成,所以向有学识的前辈们请教下,望不吝赐教。谢谢

repeat
while not(x in si) do x:=succ(x); // 如果x不在集合si中 就把x+1,直到x在集合中。
pr:=pr+[x];// 把x加入集合pr中
j:=x;
while j<=m do //这个循环是把集合si中所有x的倍数删掉
begin
si:=si-[j];
j:=j+x;
end;
until si=[ ]; //直到循环si为空结束
例如:m=10
循环第一次, x=2 删除2 4 6 8 10
pr={2}
si={3,5,7,9}
循环第二次,x=3,删除3,9
pr={2,3}
si={5,7}
循环第三次 x=5,删除 5
pr={2,3,5}
si={7}
循环第四次 x=7,删除7
pr={2,3,5,7}
si={}
结束循环。