- UID
- 34331
注册时间2007-8-14
阅读权限50
最后登录1970-1-1
感悟天道
TA的每日心情 | 开心 3 天前 |
---|
签到天数: 1992 天 [LV.Master]伴坛终老
|
是一个数学的应用问题:
已知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 编辑 ] |
|