回 帖 发 新 帖 刷新版面

主题:约瑟夫问题 qb解决办法!!!! 数组实现

INPUT  n   \\参与的人数
INPUT "shudaodeshu", k   \\循环数
DIM a(n)
FOR i = 1 TO n
a(i) = i
NEXT i
s = n
count = 0 \\  用与计数 每到k时再置0
WHILE s > 1    \\人数只剩下一个
FOR i = 1 TO n
IF a(i) <> 0 THEN
 count = count + 1
 IF count = k THEN
 PRINT a(i);   \\被踢出去的哪个家伙
 a(i) = 0  \\该位置为空,
 count = 0    \\计数器清零
 s = s - 1 \\ 人数减一
 END IF
 END IF
 NEXT i
 PRINT
 WEND
 FOR i = 1 TO n   \\输出剩下的哪个家伙
 IF a(i) <> 0 THEN
 PRINT  "then last is :"a(i)
 END IF
 NEXT i
 END

回复列表 (共3个回复)

沙发

我在前面删了你两张贴,
是因为我不懂什么叫约瑟夫问题。

现在你拿一个程序出来,我还是不知道什么回事。

看了大半天后,我大概明白你的意思。

我在GOOGLE上找了一下,你看是不是这个:

71.约瑟夫问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。

按照你的做法,应该是正确的,反复检验一下就是了。

板凳


是了
  我在网上找了好几天都没有找到有qb版的解法,只有自己动手了,花了一晚上工夫.想分享一下.[em16]

3 楼

我不喜欢用数组,我比较喜欢用字符串,n<256
input "n,k";n,k
for i=1 to n
    a$=a$+chr$(i)
next
do while len(a$)>1
   s=s+k
   if s>len(a$) then s=s mod len(a$)
   if s=0 then s=len(a$)
   a$=left$(a$,s-1)+mid$(a$,s+1)
   s=s-1
loop
print asc(a$)

我来回复

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