初学者的难题,请各位朋友帮忙!(50分)

  • 主题发起人 主题发起人 yesir
  • 开始时间 开始时间
Y

yesir

Unregistered / Unconfirmed
GUEST, unregistred user!
约瑟夫问题:m个人围成一圈,从第一个人由1开始报数,数到n的人出圈,再从下一个人由1开
始报数,数到n的人出圈,如此循环报数,打印出依次出圈人的编号.m值预先选定,n由键盘输
入.
小第我想破了头了,写了N次代码也没搞对,学习受阻了,请各位大哥帮忙.谢谢
 
用循环链表,每个节点有一个键值纪录编号。

 
动态单维数组,初始化编号,出人则置0,有人则n加1,直到所有人都出来了。
 
这个问题在以前的电脑爱好者上好象有介绍,具体是哪一期我就不知啦!
 
随便找一本数据结构的书,应该都有该问题的算法.
 
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;
const m=10;
var
ManArr:Array[0..m-1] of boolean;
n,j,i,leftcount:integer;
begin
readln(n);
if (n<1) then writeln('Error')
else
begin
write('Result:');
for i:=0 to m-1 do ManArr:=false;
leftcount:=m;
i:=0;
j:=1;
while leftcount>0 do
begin
if (j=n) then
begin
ManArr:=true;
write(i+1:4);
leftcount:=leftcount-1;
j:=0;
end
else
begin
i:=(i+1) mod m;
while (ManArr) do
i:=(i+1)mod m;
j:=j+1;
end;
end;
end;
writeln;
readln;
end.
 
借鉴zhhc的代码,不要见笑,呵呵
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;
const m=10;
var
ManArr:Array[0..m-1] of integer;
n,i,nLeft:integer;
nOut:integer;
nNum:integer;
begin
readln(n);
if (n<1) then
writeln('Error')
else
begin
write('Result:');
for i:= 0 to m-1 do ManArr:=i;
nLeft:= m;
while nLeft>0 do
begin
nOut := n mod nLeft;
if nOut = 0 then
nOut := nLeft;
nNum := ManArr[nOut-1] + 1;
write(nNum:4);
nLeft := nLeft - 1;
for i:= nOut-1 to nLeft - 1 do
ManArr := ManArr[i+1];
end;
end;
writeln;
readln;
end.
 
感谢大家的热心帮助,我己经解决了.可是分数太少,没办法一一给分.
不过我己记下名字了,以后有机会定当补尝.
 
后退
顶部