回 帖 发 新 帖 刷新版面

主题:Joseph问题

原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,…,n。
     从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,
     数到第m个人又出列,…,如此反复直到所有的人全部出列为止。
     比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
     现在的问题是:假设有k个好人和k个坏人。好人的编号的1到k,坏人的编号是k+1到2k。
     我们希望求出m的最小值,使得最先出列的k个人都是坏人。
     输入:仅有的一个数字是k(0 < k <14)。
     输出:使得最先出列的k个人都是坏人的m的最小值。
     输入样例:4
     输出样例:30

回复列表 (共4个回复)

沙发

cls
input k:m=k
do
m=m+1:s=0
for i=1 to k
n=k*2+1-i
t=(s+m-1) mod n
if t>=k then s=t:p=0 else p=1
if p then 10
next i:exit do
10 loop
? m
end

板凳

DECLARE SUB HJ (Z)
DIM SHARED K, S, M  AS DOUBLE
CLS
INPUT K
DIM A(2 * K)
M = K + 1
WHILE F = 0
F = -1: S = 0
FOR I = 0 TO K - 1
N = 2 * K - I
CALL HJ(N)
IF N = -1 THEN F = 0: M = M + 1: EXIT FOR
NEXT I
WEND
PRINT M
S = 0
10 FOR I = 1 TO 2 * K
IF A(I) > 0 THEN 20
A = A + 1
IF A = M THEN S = S + 1: A(I) = 1: A = 0: PRINT I;
20 NEXT I
IF S < K THEN 10
END
SUB HJ (Z)
T = (S + M - 1) MOD Z
IF T >= K THEN S = T: Z = 0 ELSE Z = -1
END SUB

3 楼

cls
input k:m=k
do
m=m+1:s=0
for i=1 to k
n=k*2+1-i
t=(s+m-1) mod n
if t>=k then s=t:p=0 else p=1
if p then 10
next i:exit do
10 loop
? m
end

4 楼

DECLARE SUB xx (z)
CLS
DIM SHARED s, k, m AS DOUBLE
INPUT k
m = k + 1
WHILE f = 0
f = -1: s = 0
FOR i = 0 TO k - 1
n = k * 2 - i
CALL xx(n)
IF n = -1 THEN f = 0: m = m + 1: EXIT FOR
NEXT i 
WEND
PRINT m;
END
SUB xx (z)
t = (s + m - 1) MOD z
IF t >= k THEN s = t: z = 0 ELSE z = -1
END SUB

我来回复

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