主题:急!急!急!急!急!救者加分!
54321
[专家分:20] 发布于 2005-12-10 13:27:00
约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;.....输出依次出圈的人的编号.N和M由键盘输入.
用PASCAL!
回复列表 (共8个回复)
沙发
xuzhenyi [专家分:850] 发布于 2005-12-10 14:32:00
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.
板凳
南飞的大雁 [专家分:50] 发布于 2007-10-29 19:02:00
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 楼
xjwxwy [专家分:0] 发布于 2008-10-03 20:27:00
此题用双向链表解决。
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 楼
jack-jiao [专家分:140] 发布于 2008-10-04 17:42:00
介绍一个难一点的,
下面这个程序是:每人有一个密码,数到上一次出圈的人的密码的人出圈(开始时用第一个人的密码)......输出依次出圈的人的编号.(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 楼
小田甜 [专家分:3910] 发布于 2008-10-05 15:11:00
疯狂,标准小学生数组题目……链表?!
6 楼
xjwxwy [专家分:0] 发布于 2008-10-17 20:58:00
4楼程序运行结果?
7 楼
DYF213 [专家分:90] 发布于 2008-10-26 16:24:00
学BASIC的时候做的题,你不至于吧
8 楼
jack-jiao [专家分:140] 发布于 2008-11-01 21:46:00
6楼的老兄:
你若不信,自己用我的程序去试一下???
我来回复