飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5087|回复: 14

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

[复制链接]
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1881 天

    [LV.Master]伴坛终老

    发表于 2007-12-11 13:52:02 | 显示全部楼层 |阅读模式
    是一个数学的应用问题:

        已知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 [1..1000] 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[i3]:=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[i2]=0) then i1:=i1+1;  //若位置循环变量所指的位置,其值为o,则报数循环增加一;为1则不增加
              pose:=0;    //开始报数位置只参加一轮循环
              end;
              a[i2]:=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 编辑 ]
    1.GIF
    2.GIF
    3.GIF

    Project1.rar

    161.13 KB, 下载次数: 3, 下载积分: 飘云币 -2 枚

    可执行程序

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-11 20:49:17 | 显示全部楼层
    大哥,我只会启动和退出Delphi啊
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-11 20:57:35 | 显示全部楼层
    给几组测试数据,我用“一维数组”结构写了一个算法,不知道对不对
    这个是经典问题,再复杂一些就是每个人都存储一个密码值,每次从1开
    始报数时,报的最大数在变化,以前我是用双向循环链表做的。

    给几组测试数据吧,我看看是否正确。
    PYG19周年生日快乐!

    该用户从未签到

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


    1. program Joseph;

    2. {$APPTYPE CONSOLE}

    3. uses
    4.   SysUtils;

    5. var
    6.   a: array of integer;
    7.   i,index,n,k,m,count: integer;

    8. begin
    9.   Write('输入约瑟夫环的总人数:');
    10.   Readln(n);
    11.   Write('输入报的最大数字:');
    12.   Readln(m);
    13.   Write('输入第一个开始报数的人的编号:');
    14.   Readln(k);
    15.   SetLength(a, n);

    16.   index := (k mod n) - 1;

    17.   for i := 1 to n-1 do
    18.   begin
    19.     while (a[index] <> 0) do
    20.     begin
    21.       index := (index + 1) mod n;
    22.     end;
    23.     count := 1;

    24.     while (count < m) do
    25.     begin
    26.       index := (index + 1) mod n;
    27.       if (a[index] = 0) then
    28.       begin
    29.         count := count + 1;
    30.       end;
    31.     end;
    32.     a[index] := i;
    33.   end;

    34.   for i := 1 to n do
    35.   begin
    36.     if (a[i - 1] = 0) then
    37.     begin
    38.       Write('最后一位为:', i);
    39.     end;  
    40.   end;

    41.   Readln;
    42. end.
    复制代码


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

    Joseph.zip

    24 KB, 下载次数: 8, 下载积分: 飘云币 -2 枚

    编译后的exe文件下载

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-14 19:50:34 | 显示全部楼层
    以前学的全还给老师了。哎。/:L
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1881 天

    [LV.Master]伴坛终老

     楼主| 发表于 2007-12-18 14:56:15 | 显示全部楼层
    learnlife兄弟写得是passcal语言
    看来对Delphi了解不多
    现给出一个简单的Delphi程序
    遗憾的是,不能在Memo中输出每次退出的人(Memo没弄懂)
    哪位兄弟帮忙完成!




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

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

    这是我从易语言自带程序中改过来

    这是我从易语言自带程序中改过来

    这是原程序,开始位置固定的

    这是原程序,开始位置固定的
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-12-1 21:33
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2007-12-18 19:34:01 | 显示全部楼层
    什么时候开始教编程了,我可是刚学了第一课,只会打开和关闭DELPHI,别的什么都不会呀!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-18 19:50:27 | 显示全部楼层
    呵呵,Delphi背后用的就是Pascal语言的升级版——Object Pascal语言,
    lvcaolhx请看一下Delphi的背景。
    我写的是控制台程序,在Delphi7下编译的。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-18 21:42:43 | 显示全部楼层
    勤奋才是硬道理
    我试着用C试着编译了
    还没成功~~/:L
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-19 10:23:42 | 显示全部楼层
    我成功用C编译了 但是D还没成功
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表