一道非常简单的pascal题目,求大师用最简洁的方法做一下,并解释一下,谢谢!题目:N只猴子选大王

2024年11月22日 21:26
有2个网友回答
网友(1):

program nmce;
label head,fns;
var
a,b,rst:string;
i,j,n,rn:integer;
begin
readln(n);
a:='010203040506070809';
for i:=10 to 99 do begin
 str(i,b);
 a:=a+b;
end;
delete(2*n,198-2*n,a);
rn:=n;
:head
for i:=1 to rn do
 if i mod 3=0 then begin
  delete(2*i,2,a);
  rn:=rn-1;
  end;
if length(a)<=4 then begin
 rst:=copy(0,2,a);
 goto fns;
end;
for i:=rn downto 1 do
 if (rn-i+1) mod 3=0 then begin
  delete(2*i,2,a);
  rn:=rn-1;
 end;
if length(a)<=4 then begin
 rst:=copy(3,2,a);
 goto fns;
end;
goto head;
:fns
if rst[1]:=0 then rst:=rst[2];
writeln(rst);
end.

代码有一些错误,请你修改后再运行。


基本思想:将参选的猴子编号,1号的编号为01,2号的编号为02,以此类推,然后把所有猴子的编号按顺序排在一个字符串里,然后对该字符串进行操作,2个2个地数,每数3次就从相应位置删除2个字节,从尾到头也是一样,最后只剩2个数,也就是该字符串仅占用4个字节时,若是从头到尾数,则取前两个字节作为结果;若是从尾到头数,则取后两个字节作为结果,并跳出循环,输出结果。当然,结果不能以0开头。这种方法最多可以从99只猴子中选出一只。

网友(2):

{猴子选大王}
var
a:array[1..10000] of boolean;
i,j,k,n,s:integer;
forword:boolean;
begin
readln(n);
for i:=1 to n do a[i]:=true;
k:=0; i:=0; forword:=true;
repeat
if forword then begin inc(i); if i>n then begin forword:=false; dec(i); dec(i); end; end
else begin dec(i); if i<1 then begin forword:=true; inc(i); inc(i); end; end;
if a[i] then inc(k);
if a[i] and(k mod 3=0) then
begin write(i:3); a[i]:=false; end;
s:=0;
for j:=1 to n do if a[j] then inc(s);
until s=2;
writeln;
repeat
if forword then begin inc(i); if i>n then begin forword:=false; dec(i); dec(i); end; end
else begin dec(i); if i<1 then begin forword:=true; inc(i); inc(i); end; end;
until a[i];
writeln(i);
end.