回 帖 发 新 帖 刷新版面

主题:如何解决猴子称大王问T

有N只猴子选大王,选举的办法:排成一排,从头到尾报数,报道3的倍数(3,6,9...)的退出,知道全报完,然后又从头开始,同样3的倍数退出。第3遍又是从头到尾进行,第4次又从头到尾,最剩下2只,以排在后面(按报数的顺序)的那只为大王。编程找出猴王的位置(N从键盘输入)[em7][em7]

回复列表 (共29个回复)

沙发

用集合和数组做吧,现给出算法:先定义一个1到N的集合,用数组,用循环一次次地把下标为3的倍数的数从集合中去掉,到最后不够三个数时再取最后一个。

板凳

到底是怎样做??????

3 楼

用PASCAL工具编吗?

4 楼

是的

5 楼

很简单的,用递归呀

6 楼

麻烦你写出来

7 楼

program ex;
   var
      a:array[1..1000]of 0..1;
      i,j,k,n:integer;
      ok:boolean;
      procedure left(m:integer);
      begin
           i:=1;ok:=true;k:=0;
           while ok and (i<=n) do
           begin
                if a[i]=0 then k:=k+1;
                if (m=2)and(k=1) then
                begin
                     write(i:5);
                     readln;
                     ok:=false
                end;
                if k=3 then begin a[i]:=1;ok:=false;write(i:5) end;
                i:=i+1
           end
      end;
      procedure right(m:integer);
      begin
           i:=n;ok:=true;k:=0;
           while ok and (i>=1) do
           begin
                if a[i]=0 then k:=k+1;
                if (m=2)and(k=1) then
                begin
                     write(i:5);
                     readln;
                     ok:=false
                end;
                if k=3 then begin a[i]:=1;ok:=false;write(i:5) end;
                i:=i-1
           end
      end;

      procedure choice(m,fx:integer);
         var k:integer;
      begin
           if m=2 then
           begin
                case fx of
                     1:left(m);
                     -1:right(m)
                end
           end else begin
                         case fx of
                              1:begin
                                     left(m);
                                     fx:=-1*fx
                                end;
                              -1:begin
                                      right(m);
                                      fx:=-1*fx
                                 end;
                         end;
                         choice(m-1,fx);
                    end;
      end;
   begin
        writeln('input n=');readln(n);
        fillchar(a,sizeof(a),0);
        choice(n,1);
   end.

8 楼

为什么不用循环链表呢?

9 楼

这题不知你有没有写错,怎么无论我是用什么方法编或是用笔来手动计,不管输入的N是多大的数,结果都是在排第二位的那个是大王的?

10 楼

本题不用计算,动脑筋想一想,也应该能知道答案是2。难道不是吗?

我来回复

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