[pascal]直线队列、环形队列报数问题

【例1】直线队列报数问题:

1号-100号共100人站成一队,按顺序1、2、3报数,报到3的人退出队伍,剩下的人从头开始重新1、2、3报数......,这样一直进行下去,{zh1}剩下的5个人分别是多少号?


【程序思路】:

开a数组,存放各人号码
开b数组,存放各人状态

位置计数器清零
报数计数器清零
退队人数计数器清零

repeat循环

   位置计数器加1
  
   如果位置计数器=101,说明到队尾,
                  要做的事:位置计数器清0
                            报数计数器清0

   如果状态为T,报数计数器加1

   如果报数计数器=3,
                  要做的事:报数计数器清0
                            修改此人状态为F,表示退队
                            退队计数器加1

直到退队人数=95

for循环刷一遍b数组,发现T,就输出对应的a数组号码     


【参考程序】:

var a:array [1..100] of integer;  //队员号码数组
    b:array [1..100] of boolean;  //队员状态数组
   wz:integer;  //位置计数器
   bs:integer;  //报数计数器
   td:integer;  //退队计数器

begin
   for wz:=1 to 100 do begin
                         a[wz]:=wz;
                         b[wz]:=true;
                       end;

   wz:=0;bs:=0;td:=0;
  
   repeat

      inc(wz);
      if wz=101 then begin
                       wz:=1;
                       bs:=0;
                      end;

      if b[wz] then inc(bs);     

      if bs=3 then begin
                        bs:=0;
                        b[wz]:=false;
                        inc(td);
                   end;

   until td=95;

   for wz:=1 to 100 do if b[wz] then write(a[wz]:4);writeln;
   readln;
end.

———————————————————————

【例2】环形队列报数问题:

1号-100号共100人围成一圈,从1号开始按顺序1、2、3报数,报到3的人退出队伍,循环进行下去,{zh1}剩下的5个人分别是多少号?


【程序思路】:

开a数组,存放各人号码
开b数组,存放各人状态

位置计数器清零
报数计数器清零
退队人数计数器清零

repeat循环

   位置计数器加1
  
   如果位置计数器=101,
           要做的事:位置计数器置1

   如果状态为T,报数计数器加1

   如果报数计数器=3,
           要做的事:报数计数器清0
                     修改此人状态为F,表示退队
                     退队计数器加1
直到退队人数=95

for循环刷一遍b数组,发现trueT,就输出对应的a数组号码     

 

【参考程序】:

var a:array [1..100] of integer;  //队员号码数组
    b:array [1..100] of boolean;  //队员状态数组
   wz:integer;  //位置计数器
   bs:integer;  //报数计数器
   td:integer;  //退队计数器

begin
   for wz:=1 to 100 do begin
                         a[wz]:=wz;
                         b[wz]:=true;
                       end;

   wz:=0;bs:=0;td:=0;
  
   repeat
      inc(wz);

      if wz=101 then begin
                       wz:=1;
                     end;

      if b[wz] then inc(bs);
     
      if bs=3 then begin
                      bs:=0;
                      b[wz]:=false;
                      inc(td);
                   end;
   until td=95;

   for wz:=1 to 100 do if b[wz] then write(a[wz]:4);writeln;

   readln;
end.

   

郑重声明:资讯 【[pascal]直线队列、环形队列报数问题】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——