主题:这题怎么做?
Matodied
[专家分:7560] 发布于 2007-04-25 18:14:00
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
最后更新于:2007-04-30 21:44:00
回复列表 (共7个回复)
沙发
wzc1996 [专家分:1680] 发布于 2007-04-25 20:27:00
[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]
板凳
moz [专家分:37620] 发布于 2007-04-26 11:30:00
把约斯夫的号码变成顺序号就是了
3 楼
&佑慧妹妹& [专家分:660] 发布于 2007-04-30 19:40:00
原来是这样,老师的问题我知道解决方法了!
4 楼
Matodied [专家分:7560] 发布于 2007-04-30 21:49:00
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 楼
哈利波特2008 [专家分:20] 发布于 2007-05-01 13:37:00
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 楼
红辣椒妹 [专家分:80] 发布于 2007-07-21 15:51:00
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 楼
wx.psfx [专家分:10] 发布于 2007-10-17 13:27:00
我来回复