回 帖 发 新 帖 刷新版面

主题:这题怎么做?

JOSEPH问题如下:有N个人,编号为1-N,坐成一圈,任意给出一个数M,使他们从1号开始报数,报到M的人拉出来,再从下一个人开始报,报到M的人再拉出来……直到所有人全部拉出来为止。
现在的问题是,假设这N个人是随便坐的,从第一个人开始,先把这个人拉出来,刚好是1号,再从下一个开始报数,报到2的人拉出来,刚好是2号,再从下一个开始报,报到3的人拉出来,正好是3号……试打印出这N个人编号的原始顺序。

输入:N(N<=1000)
输出:N个人编号的原始顺序.

如:输入 7
输出:
1  5  2  7  4  3  6

回复列表 (共7个回复)

沙发

[em7]
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 :? I
NEXT
LOOP
FOR I=1 TO N
IF A(I)=1 THEN ? I
NEXT
意思:把N个数变为1,数到M便变成0
 [em9]

板凳

把约斯夫的号码变成顺序号就是了

3 楼

原来是这样,老师的问题我知道解决方法了!

4 楼

2楼的,你没看清楚我的要求.
很遗憾,我已经编出来了.
CLS
INPUT n
DIM a(n), b(n): FOR i = 1 TO n: a(i) = 1: NEXT i
i = 0: j = 0: s = n: k = 1
DO
  j = j + 1
  DO
    i = i + 1
    IF i > n THEN i = 1
  LOOP UNTIL a(i) = 1
  IF j = k THEN
     a(i) = 0: j = 0: s = s - 1: k = k + 1
     b(i) = n - s
  END IF
LOOP UNTIL s = 0
FOR i = 1 TO n: PRINT b(i); : NEXT i: END
我没有结掉,为了使你们想想有没有更好的方法.

5 楼

CLS
INPUT n
DIM a(n), b(n): FOR i = 1 TO n: a(i) = 1: NEXT i
i = 0: j = 0: s = n: k = 1
DO
  j = j + 1
  DO
    i = i + 1
    IF i > n THEN i = 1
  LOOP UNTIL a(i) = 1
  IF j = k THEN
     a(i) = 0: j = 0: s = s - 1: k = k + 1
     b(i) = n - s
  END IF
LOOP UNTIL s = 0
FOR i = 1 TO n: PRINT b(i); : NEXT i: END

6 楼

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

7 楼


                  
                  

我来回复

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