回 帖 发 新 帖 刷新版面

主题:谁能帮我设计出来这个程序?

我是个高中生,老师叫我们完成的作业,不过我做了好久还是没有做好,希望您能抽出一点时间帮我一下。
我们目前学完了数组,衷心希望您能用数组及数组之前算法;
另外希望旁边您能注释一下(我水平有限啊,呵呵);
正题:
有一群猴子选共N只,要选大王,他们约定成一排,从头到尾1至3报数,报到3的猴子留下,其余退出,留下的猴子再从尾至头1至3报数,再留下3的猴子,重新1至3报数...如此进行直到剩下的一只猴子,若剩下两只猴子,已原来战队时排在后面的那只猴子为王。编程,输出最初站在何处的猴子为王。

非常感谢!

回复列表 (共6个回复)

沙发

好深奥啊…这么难学!!!!!!

板凳

好深奥啊…这么难学!!!!!!

3 楼

program monkey;
var n,a0:longint;
    a:array [1..1000000] of boolean;
procedure init;
var i:longint;
begin
  readln(n);
  fillchar(a,sizeof(a),false);
  for i:=1 to n do
    a[i]:=true;
end;
procedure main;
var flag,p,i:longint;
begin
  a0:=n;
  while a0>2 do
  begin
    flag:=0;
    p:=0;
    for i:=1 to a0 do
    begin
      if a[i] then
      begin
        flag:=flag+1;
        p:=p+1;
      end;
      if flag mod 3=0 then
      begin
         a[i]:=false;
         flag:=0;
      end;
    end;
    a0:=p;
  end;
  for i:=n downto 1 do
    if a[i] then
    begin
      writeln(i);
      exit;
    end;
end;
begin
  init;
  main;
end.

直接打的。。没编译,,

4 楼

如果你的N小于等于255的话可以采用以下方法

var n,c,j,i,s:integer;
    a:set of 1..255;
begin
  readln(n);
  a:=[1..n];
  s:=n;
  repeat
    c:=c+1;
    if c=2 then c:=0;
    j:=0;
    if c=1 then
      for i:=1 to n do begin
        if i in a then begin
          j:=j+1;
          if (j mod 3)<>0 then begin a:=a-[i];s:=s-1 end
        end
      end
    else
      for i:=n downto 1 do begin
        if i in a then begin
          j:=j+1;
          if (j mod 3)<>0 then begin a:=a-[i];s:=s-1 end
        end
      end;
  until s<3;
  for i:=1 to n do if i in a then begin
    write(i);
    readln;
    halt
  end
end.

5 楼

如果N比较大的话就用数组

var n,c,j,i,s:integer;
    a:array[1..5000]of boolean;
begin
  readln(n);
  fillchar(a,sizeof(a),true);
  s:=n;
  repeat
    c:=c+1;
    if c=2 then c:=0;
    j:=0;
    if c=1 then
      for i:=1 to n do begin
        if a[i] then begin
          j:=j+1;
          if (j mod 3)<>0 then begin a[i]:=false;s:=s-1 end
        end
      end
    else
      for i:=n downto 1 do begin
        if a[i] then begin
          j:=j+1;
          if (j mod 3)<>0 then begin a[i]:=false;s:=s-1 end
        end
      end;
  until s<3;
  for i:=1 to n do if a[i] then begin
    write(i);
    readln;
    halt
  end
end.

6 楼

注意在if c=1里的两个for循环,其实都是没有必要用begin和end,但是这个不得不要,原因就是假如没有的话系统会默认把 if c=1的else 看成是 if i in a(if a[i])里的else,程序就会出错,第二个for循环的可要可不要

我来回复

您尚未登录,请登录后再回复。点此登录或注册