lvcaolhx 发表于 2007-12-11 13:52:02

Delphi课外练习题1---约瑟夫环(总结)

是一个数学的应用问题:

    已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,求剩下的最后一位?

要求:只能使用数组、字符串解决问题,不能使用指针,链表。
测试数据:
如:6个人,报数4,从3开始,最终为1
15个人,报数5,从5开始,最终为5
10个人,报数5,从1开始,最终为3

不完美的Delphi程序:
源代码
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Button1: TButton;
    Edit4: TEdit;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
sum,BaoShu,YuShu,i1,pose,CiShu,i2,i3:integer;
i:string;
a:array of integer;
begin
sum:=StrToInt(Edit1.Text); //该函数用于将“字符型”转换成“整数型”
BaoShu:=StrToInt(Edit2.text);   //取报数值
YuShu:=sum;
pose:=StrToInt(Edit3.text)-1;
   i2:=0;       //初始化
   for i3:=0 to 1000 do a:=0;   //数组初始化
while (YuShu>=1) do
begin
i1:=1;

         while (i1<= BaoShu) do   //报数循环变量i1从0开始循环
      begin
          i2:=pose+i2+1;
          if (i2>sum) then i2:=1;    //位置循环变量大于总数,则从1开始
          if (a=0) then i1:=i1+1;//若位置循环变量所指的位置,其值为o,则报数循环增加一;为1则不增加
          pose:=0;    //开始报数位置只参加一轮循环
          end;
          a:=1;//退出的位置
          YuShu:=YuShu-1;
          CiShu:=CiShu+1;
            end;
       Edit4.Text:=IntToStr(i2);
end;

end.

思路:1.总人数为m,则要循环m-1次
   2.报数超出总数时,得从头开始
   3.报数所指位置被淘汰时,报数继续而循环变量值不增加

[ 本帖最后由 lvcaolhx 于 2007-12-18 14:59 编辑 ]

iawen 发表于 2007-12-11 20:49:17

大哥,我只会启动和退出Delphi啊

learnlife 发表于 2007-12-11 20:57:35

给几组测试数据,我用“一维数组”结构写了一个算法,不知道对不对
这个是经典问题,再复杂一些就是每个人都存储一个密码值,每次从1开
始报数时,报的最大数在变化,以前我是用双向循环链表做的。

给几组测试数据吧,我看看是否正确。

learnlife 发表于 2007-12-12 12:02:33

关于Delphi课外练习题1---约瑟夫环的程序
大家好,我是learnlife,写的不好的地方请大家多多指教。
楼主给出的以下三组测试数据:
6个人,报数4,从3开始,最终为1
15个人,报数5,从5开始,最终为5
10个人,报数5,从1开始,最终为3
均通过测试。


program Joseph;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
a: array of integer;
i,index,n,k,m,count: integer;

begin
Write('输入约瑟夫环的总人数:');
Readln(n);
Write('输入报的最大数字:');
Readln(m);
Write('输入第一个开始报数的人的编号:');
Readln(k);
SetLength(a, n);

index := (k mod n) - 1;

for i := 1 to n-1 do
begin
    while (a <> 0) do
    begin
      index := (index + 1) mod n;
    end;
    count := 1;

    while (count < m) do
    begin
      index := (index + 1) mod n;
      if (a = 0) then
      begin
      count := count + 1;
      end;
    end;
    a := i;
end;

for i := 1 to n do
begin
    if (a = 0) then
    begin
      Write('最后一位为:', i);
    end;
end;

Readln;
end.

[ 本帖最后由 learnlife 于 2007-12-12 12:09 编辑 ]

独晨 发表于 2007-12-14 19:50:34

以前学的全还给老师了。哎。/:L

lvcaolhx 发表于 2007-12-18 14:56:15

learnlife兄弟写得是passcal语言
看来对Delphi了解不多
现给出一个简单的Delphi程序
遗憾的是,不能在Memo中输出每次退出的人(Memo没弄懂)
哪位兄弟帮忙完成!




本来想做成图中的样子,水平不够呀!

[ 本帖最后由 lvcaolhx 于 2007-12-18 15:12 编辑 ]

pingan 发表于 2007-12-18 19:34:01

什么时候开始教编程了,我可是刚学了第一课,只会打开和关闭DELPHI,别的什么都不会呀!

learnlife 发表于 2007-12-18 19:50:27

呵呵,Delphi背后用的就是Pascal语言的升级版——Object Pascal语言,
lvcaolhx请看一下Delphi的背景。
我写的是控制台程序,在Delphi7下编译的。

liangwj888 发表于 2007-12-18 21:42:43

勤奋才是硬道理
我试着用C试着编译了
还没成功~~/:L

xhpro 发表于 2007-12-19 10:23:42

我成功用C编译了 但是D还没成功
页: [1] 2
查看完整版本: Delphi课外练习题1---约瑟夫环(总结)