主题:请MOZ来解决“猴子选大王”这道题
小精灵1号
[专家分:1040] 发布于 2007-08-09 10:30:00
有n个猴子选大王,先从头到尾1至3报数,报到3的猴子推出,报至尾后,再从尾到头1至3报数,报到3的猴子退出……依次类推,当剩下两只猴子时,报1的为大王,问:若想当大王,应站在什么位置。
输入: 整数n(猴子的只数,n<=60000)
输出: 想当大王应站的位置
样例输入:
10
样例输出:
8
回复列表 (共19个回复)
沙发
wzc1996 [专家分:1680] 发布于 2007-08-09 12:00:00
CLS
INPUT N, M
DIM A(N)
FOR I = 1 TO N: A(I) = 1: NEXT
C = N
DO UNTIL C = 1
FOR I = 1 TO N
S = S + A(I)
IF S = M THEN C = C - 1: S = 0: A(I) = 0: PRINT I
NEXT
LOOP
FOR I = 1 TO N
IF A(I) = 1 THEN PRINT I
NEXT
N是人数,M是相隔的数
在本题中输入3
板凳
snoopy7 [专家分:70] 发布于 2007-08-09 22:19:00
CLS
INPUT n
FOR i = 1 TO n: a(i) = 1: NEXT
FOR i = 1 TO n - 1
l = 0
DO
s = s + 1: IF s > n THEN s = 1
l = l + a(s)
LOOP UNTIL l = 3
a(s) = 0
NEXT
PRINT s
3 楼
snoopy7 [专家分:70] 发布于 2007-08-10 08:01:00
少写了DIM a(n)
4 楼
moz [专家分:37620] 发布于 2007-08-10 18:20:00
2楼把问题想得太简单了.得出的结果好像也不对吧.
[color=ff00ff] 报至尾后,再从尾到头1至3报数 [/color]
题意是不是"报到尾后,再从尾 [color=0000ff] 开始 [/color] 到头1到3报数?
如果我没有理解错的话,那么1楼的代码也忽略了从后面开始数的处理,
运行一下1楼的代码输入10得出的结果好像也不是8,
我整理了一下思路,觉得逆向思维值得推荐,得出的结果是:
f( 10 ) = 8
f( 6万 ) = 23863
f( 20亿 ) = 888465088
还请楼主拿给老师让老师看看.有时间也让老师验证一下看对不对,呵呵,
至于代码的原理以及处理的过程,呵呵,你们有时间自己慢慢看看看能不能理解,
我反正是看不懂.就算是我自己写的,我再回头看也都会头疼了.
input n&
dim a&(52)
do until n&<3
c&=c&+1
a&(c&)=n&\3
n&=n&-a&(c&)
loop
l&=1
for i&=c& to 1 step-1
n&=l&+l&\2
l&=r&+a&(i&)-l&\2
r&=n&
next
print r&+1
回头一看,没想到是这么几行代码就解决了,呵呵.QB就是好,(顺便卖卖广告)
5 楼
moz [专家分:37620] 发布于 2007-08-10 18:26:00
有点难看,还是默认变量简洁一点
deflng a-z
input n
dim a(52)
do until n < 3
c = c + 1
a(c) = n \ 3
n = n - a(c)
loop
p = 1
for i = c to 1 step -1
n = p + p \ 2
p = q + a(i) - p \ 2
q = n
next
print q + 1
6 楼
QB小猪 [专家分:1200] 发布于 2007-08-11 11:01:00
CLS
INPUT N
DIM H(N)
DO
W = W + 1: K = 0
IF W MOD 2 = 1 THEN A = 1: B = N: C = 1 ELSE A = N: B = 1: C = -1
FOR I = A TO B STEP C
IF H(I) = 1 THEN 10
IF S = N - 2 THEN PRINT I: END
K = K + 1: IF K MOD 3 = 0 THEN H(I) = 1: S = S + 1
10 NEXT I
LOOP
END
我相信一定是对的哦!!!
7 楼
moz [专家分:37620] 发布于 2007-08-11 11:11:00
楼上的程序的确是对的,但一些习惯建议改进一下.
1. 把 if 块使用明确一些
2. 避免使用行号跳转之类的东西
3. 少用分号,只能显示少几行,但理解上会有点问题
A. 另外,好像算不到六万.因为占用的数组内存较大,已经溢出QB的限制了,
B. 值得赞扬的是它完全是按照题目的要求来实现每步处理,而且还比较高效的,
C. 如果真的是你自己想到的自己写出来的,那么,要赞你一个了.
8 楼
Matodied [专家分:7560] 发布于 2007-08-11 14:44:00
我以前也不会这道题,(总是显示“Subscript out of range”,一检查,i要么是n+1,要么是-1)谢谢你们的指点!!!!!!!!!!!!!!!!!!!!!!!!(省略10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000个!)
9 楼
moz [专家分:37620] 发布于 2007-08-11 20:01:00
楼上那些零能不能用 10^433 代替?
再加多几个 ^ 号都没问题的.
10 楼
网虫一号 [专家分:1230] 发布于 2007-08-13 11:05:00
CLS
INPUT N
DIM M(N)
DO
X = X + 1
IF X MOD 2 <> 0 THEN A = 1: B = N: C = 1 ELSE A = N: B = 1: C = -1
J = 0
FOR I = A TO B STEP C
IF M(I) = 1 THEN 10
IF T = N - 2 THEN PRINT I: END
J = J + 1
IF J MOD 3 = 0 THEN M(I) = 1: T = T + 1
10 NEXT I
LOOP
END
我来回复