【题目描述】有N只猴子围成一圈,每只各一个从1到N中的编号,打算从中选出一个大王;经过协商,决定出选大王的规则:从第一个开始循环报数,数到M的猴子出圈,最后剩下来的就是大王。要求:从键盘输入N、M,编程计算哪一个编号的猴子成为大王
【分析】 用一维数组存储猴子的编号,删除某个猴子后,后面的猴子前移,N减一,报数一个一个的报,不要M个的报,便于处理特殊情况,下面的代码写于二00四年11月10日,很简练。 (推荐使用链表实现)
【Pascal代码】
PROGRAM MONKEY;
CONST MAX=30;
VAR
N,M,I,J:INTEGER;
A:ARRAY[1..MAX] OF INTEGER;
BEGIN
READLN(N,M);
FOR I:=1 TO N DO A[I]:=I;
I:=1;
WHILE N>1 DO BEGIN
FOR J:=1 TO M-1 DO
IF I+1>N THEN I:=1 ELSE INC(I);
FOR J:=I TO N-1 DO A[J]:=A[J+1];
DEC(N);
IF I>N THEN I:=1;
END;
WRITE(A[1]);
READLN
END.
【变形猴子选大王】有M个人围成一圈,每人有一个编号,从编号为1的人开始,每隔N个出圈,按出圈次序排成一列,其编号刚好按顺序从1到M。要求:从键盘输入M、N,编程计算并输出这M个人原来在圈中的位置。