回 帖 发 新 帖 刷新版面

主题:急!急!急!急!急!救者加分!

约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;.....输出依次出圈的人的编号.N和M由键盘输入.
用PASCAL!

回复列表 (共8个回复)

沙发

var a:array[1..1000] of integer;
m,n,i,j,k:integer;
begin
readln(m);
for i:=1 to m do
begin
a[i]:=i;
end;
k:=0;
readln(n);
for i:=1 to m do
begin
for j:=1 to n do
begin
if k<=m-1 then k:=a[k+1] else
k:=1;
end;
write(a[k]:3);
end;
end.

板凳

Program exe_1_1_1;
 var a:array[1..1000] of integer;
     m,n,i,j,k:integer;
  begin
   readln(m);
   for i:=1 to m do
    begin
     a[i]:=i;
    end;
   k:=0;
   readln(n);
   for i:=1 to m do
    begin
     for j:=1 to n do
      begin  
       if k<=m-1 then k:=a[k+1]
                 else k:=1;
      end; 
     write(a[k]:3);
    end;
  end.
试试,不行了再找我。

3 楼

此题用双向链表解决。
program Joseph;
type
    pnode=^node;
    node=record
    person:word;
    prec,next:pnode;
    end;
function GetNode(n:word):pnode;
var
   p:pnode;
begin
     GetMem(p,SizeOf(node));
     p^.person:=n;
     p^.prec:=nil;
     p^.next:=nil;
     GetNode:=p;
end;
function GetARing(NumberOfGuests:word):pnode;
var
   head,tail,tmp:pnode;
   i:word;
begin
     head:=nil;tail:=nil;
     if NumberOfGuests>0 then
     begin
             head:=GetNode(1);
             head^.prec:=head;
             head^.next:=head;
             tail:=head;
     for i:=2 to NumberOfGuests do
     begin
          tmp:=GetNode(i);
          tail^.next:=tmp;
          tmp^.next:=head;
          tail^.next^.prec:=tail;
          tail:=tail^.next;
     end;
     head^.prec:=tail;
     end;
     GetARing:=head;
end;
function Dispose(var start:pnode;n:word):word;
var
   i:word;
   p:pnode;
begin
     p:=start;
     if p=nil then Dispose:=0
     else begin
     for i:=1 to n-1 do p:=p^.next;
     p^.prec^.next:=p^.next;
     p^.next^.prec:=p^.prec;
     if p=p^.next then start:=nil else
     start:=p^.next;
     Dispose:=p^.person;
     FreeMem(p,SizeOf(node));
     end;
end;
procedure PrintRing(head:pnode);
var
   p:pnode;
   i:word;
begin
     p:=head;
     if p<>nil then
     repeat
           write(p^.person:4);
              p:=p^.next;
     until    p=head;
end;
procedure PrintRingToText(head:pnode;var tf:text);
var
   p:pnode;
   i:word;
begin
     p:=head;
     if p<>nil then
     repeat
           write(tf,p^.person:4);
              p:=p^.next;
     until    p=head;
end;
var
   p:pnode;
   m,n,t:word;
   tf:text;
begin
     write('m:');readln(m);
     write('n:');readln(n);
     assign(tf,'a.txt');
     rewrite(tf);
     writeln(tf,'M=',m);
     writeln(tf,'N=',n);
     p:=GetARing(m);
     PrintRing(p);
     PrintRingToText(p,tf);
     while true do
     begin
          t:=dispose(p,n);
          if t=0 then break;
          writeln('    --',t);
          writeln(tf,'    --',t);
          PrintRing(p);
          PrintRingToText(p,tf);
     end;
     close(tf);
end.
输入 m=10,n=7 结果如下,保留在a.txt文件中:

M=10
N=7
   1   2   3   4   5   6   7   8   9  10    --7
   8   9  10   1   2   3   4   5   6    --4
   5   6   8   9  10   1   2   3    --2
   3   5   6   8   9  10   1    --1
   3   5   6   8   9  10    --3
   5   6   8   9  10    --6
   8   9  10   5    --10
   5   8   9    --5
   8   9    --8
   9    --9


4 楼

介绍一个难一点的,
下面这个程序是:每人有一个密码,数到上一次出圈的人的密码的人出圈(开始时用第一个人的密码)......输出依次出圈的人的编号.(N由键盘输入,密码随机产生)
program joseph;
type jose=^re;
       re=record
         id:integer;
         mm:integer;
         next:jose;
       end;
var s,head:jose;
    n:integer;

procedure crea;
var p,q:jose;
    i:integer;
begin
  randomize;
  new(p);
  head:=p;
  p^.id:=1; p^.mm:=(1+random(n+1));q:=p;
  write('  ',p^.id,'-',p^.mm);
  for i:= 2 to n do
  begin
    new(p);
    p^.id:=i;
    p^.mm:=(1+random(n+1));
    write('  ',p^.id,'-',p^.mm);
    q^.next:=p; q:=p;
  end;
  q^.next:= head;
  writeln;
end;

procedure bs(a:integer;p:jose);
var r:jose;
    t:integer;
begin
  t:=1;
  s:=p;
  if (p^.next=p) then
  begin
    writeln(s^.id,' ',s^.mm);
    halt;
  end
    else
    begin
      repeat
        r:=s^.next;
        inc(t);
      until(t=a);
      writeln(s^.id,' ',s^.mm);
      s^.next:=r^.next;
      a:=r^.mm;
      dispose(r);
      bs(a,s^.next);
    end;
end;
begin
  write('n=');
  read(n);
  crea;
  bs(head^.mm,head);

end.
都一样,用链表做!!

5 楼

疯狂,标准小学生数组题目……链表?!

6 楼

4楼程序运行结果?

7 楼

学BASIC的时候做的题,你不至于吧

8 楼

6楼的老兄:
你若不信,自己用我的程序去试一下???

我来回复

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