主题:如何解决猴子称大王问T
QQ331373582
[专家分:1500] 发布于 2005-05-26 20:01:00
有N只猴子选大王,选举的办法:排成一排,从头到尾报数,报道3的倍数(3,6,9...)的退出,知道全报完,然后又从头开始,同样3的倍数退出。第3遍又是从头到尾进行,第4次又从头到尾,最剩下2只,以排在后面(按报数的顺序)的那只为大王。编程找出猴王的位置(N从键盘输入)[em7][em7]
回复列表 (共29个回复)
沙发
lyn532226 [专家分:230] 发布于 2005-05-27 19:00:00
用集合和数组做吧,现给出算法:先定义一个1到N的集合,用数组,用循环一次次地把下标为3的倍数的数从集合中去掉,到最后不够三个数时再取最后一个。
板凳
QQ331373582 [专家分:1500] 发布于 2005-05-28 14:12:00
到底是怎样做??????
3 楼
kuuga [专家分:190] 发布于 2005-05-28 17:52:00
用PASCAL工具编吗?
5 楼
天空飞雪 [专家分:960] 发布于 2005-05-28 19:41:00
很简单的,用递归呀
6 楼
QQ331373582 [专家分:1500] 发布于 2005-05-29 13:40:00
麻烦你写出来
7 楼
天空飞雪 [专家分:960] 发布于 2005-05-29 15:00:00
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 楼
aran [专家分:50] 发布于 2005-05-29 22:18:00
为什么不用循环链表呢?
9 楼
lyn532226 [专家分:230] 发布于 2005-05-30 18:01:00
这题不知你有没有写错,怎么无论我是用什么方法编或是用笔来手动计,不管输入的N是多大的数,结果都是在排第二位的那个是大王的?
10 楼
endure1968 [专家分:70] 发布于 2005-05-30 20:56:00
本题不用计算,动脑筋想一想,也应该能知道答案是2。难道不是吗?
我来回复