回 帖 发 新 帖 刷新版面

主题:QB考试提,高手进来帮忙,"选夏令营旗手"

每年的“信息与未来”小学生夏令营活动,组织者均设计安排了许多有趣的活动。去年小明与许多同学一起参加的走迷宫就是其中的一项,他经过努力并取得了好成绩。
   今年小明又怀着极大的兴趣来到了营地,首先看到组织者贴出的一个海报:挑选本次夏令营的旗手!由于报名的营员非常多,于是只好规定让所有参加的N个人坐成一圈,并按顺时针方向从1~N编号。由第1人开始进行1~M报数,报到M的人出圈,再从下一个人重新开始从1到m报数。如此进行下去,直到剩下一人为止,就是本次夏令营的旗手。
小明非常渇望能成为旗手,你能编一个程序帮助他实现愿望吗?如果可以的话,你的程序应输出小明在圈中的编号。
 【输 入】:键盘输入二个整数N,M (2≤N,M≤100,N≥ M ),用一个逗号分隔。
 【输 出】:输出到屏幕 。一个整数,表示小明在圈中的编号。
 【样 例】:
     输入                                     输出
9,3                                     1


应该是猴子选大王,不过怎么编呢?希望给出思路和程序

回复列表 (共5个回复)

沙发

老帖里有

板凳

在哪???????????????????

3 楼

普通的Joseph问题,猴子选大王比这难多了。
方法:刚开始定义一个存放每个人状态的数组,元素A(I)值为1表示I号还在圈里,值为0表示I号已经被拉出去了。计数器J从0开始,碰到还没被拉出去的人就加1,到头了就重来。J数到M时就把这个人拉出去,最后只剩一个人为止。

4 楼

程序:
CLS
INPUT n, m
IF n < 2 OR m > 100 OR n < m THEN PRINT "Data Error!": END
DIM a(n): FOR i = 1 TO n: a(i) = 1: NEXT i
j = 0: k = 0: s = n
DO
  k = k + 1: IF k > n THEN k = 1
  DO UNTIL a(k)
     k = k + 1
     IF k > n THEN k = 1
  LOOP
  j = j + 1
  IF j = m THEN
     a(k) = 0: s = s - 1: j = 0
  END IF
  IF s = 1 THEN EXIT DO
LOOP
FOR i = 1 TO n
    IF a(i) THEN PRINT i: END
NEXT i
运行:
输入50,13输出5
输入2000,70输出478
输入10000,99输出9729

5 楼

上一楼的程序忒长了吧?
CLS
INPUT N,M:DIM A(N)
20 FOR I=1 TO N
IF A(I)<>0 THEN 10
K=K+1
IF K MOD M=0 THEN S=S+1:A(I)=1
IF S=N THEN ?I:END
10 NEXT I:IF S<N THEN 20
END

我来回复

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