有何方法将本程序修改得简单点?(100分)

  • 主题发起人 主题发起人 ooooh
  • 开始时间 开始时间
O

ooooh

Unregistered / Unconfirmed
GUEST, unregistred user!
请大家先运行一下这程序看清结果,然后再提出修改方法.
能否用递归,矩阵呢? 最简单最好是什么方法? 烦请给出实例.
unit Unit1;

interface

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

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i1,i2,i3,i4,i5,i6:integer;
s:string;
begin
listbox1.Clear;
for i1:=0 to 4 do
for i2:=i1+1 to 5 do
for i3:=i2+1 to 6 do
for i4:=i3+1 to 7 do
for i5:=i4+1 to 8 do
for i6:=i5+1 to 9 do begin
s:=inttostr(i1)+'.'+inttostr(i2)+'.'+inttostr(i3)+'.'+inttostr(i4)+'.'+inttostr(i5)+'.'+inttostr(i6);
listbox1.Items.Add(s);
end;
label1.Caption:=inttostr(listbox1.Count);
end;

end.
 
这年头怎么了?数学家一个接一个?
 
现在的代码已经很好啊。
 
就这样的功能,这些朴素的代码最好了, 没有比这更简洁易读的代码了.
 
这里提供一种比你的复杂的,但是走的是另外一个思路:
procedure TForm1.Button1Click(Sender: TObject);
var
a : array[1..6] of integer;
i : integer;
s : string;

procedure carry(n: integer);
begin
a[n - 1] := a[n - 1] + 1;
if a[n - 1] >= n + 3 then
carry(n - 1);
a[n] := a[n - 1] + 1;
end;
begin
listbox1.Clear;
for i := 1 to 6 do a := i - 1;

s := inttostr(a[1]) + '.' + inttostr(a[2]) + '.' + inttostr(a[3]) + '.' + inttostr(a[4]) + '.' + inttostr(a[5]) + '.' + inttostr(a[6]);
listbox1.Items.Add(s);

while a[1] < 4 do
begin
inc(a[6]);

if a[6] >= 10 then carry(6);

s := inttostr(a[1]) + '.' + inttostr(a[2]) + '.' + inttostr(a[3]) + '.' + inttostr(a[4]) + '.' + inttostr(a[5]) + '.' + inttostr(a[6]);
listbox1.Items.Add(s);
end;
label1.Caption := inttostr(listbox1.Count);
end;
 
To 楼主:
现在很多人把“递归”当高科技,写个递归好像有多么了不起,其实递归就是一坨屎;在编译器中,递归都会化成“循环+入栈+出栈”。
您写的这个循环没什么不好的!
 
大家都说我编的简单,但大家有没有试过将所有变量的最大值都加20后再运行一下?即是4变成24,5变成25...会发现什么?
慢,非常慢.肯定有更好的方法的...帮忙想想.谢谢大家了!
 
zhongq14:
你的方法其实和我的差不多,都是一样慢...呵呵....
 
To ooooh:
其实您根本没有抓住问题的重点。
慢,为什么慢,是循环的问题么?根本不是!你把循环内的部分去掉试试,还慢么?慢的根本原因是 ListBox 的载入和显示速度,不是别的,你再优化算法都没用,还是在 ListBox 上下功夫吧...我这有一个方法,不算简单,但是速度快,60万条记录只需要3秒钟:
首先把 ListBox1 的 Style 设置为 lbVirtual,然后把下面这段代码贴过去就行了。
...
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ListBox1Data(Control: TWinControl; Index: Integer;
var Data: String);
procedure Button1Click(Sender: TObject);
private
FMemSL: TStringList;
procedure FillMemSL;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FillMemSL;
var
i1, i2, i3, i4, i5, i6: Integer;
begin
FMemSL.Clear;
for i1 := 0 to 24 do
for i2 := i1 + 1 to 25 do
for i3 := i2 + 1 to 26 do
for i4 := i3 + 1 to 27 do
for i5 := i4 + 1 to 28 do
for i6 := i5 + 1 to 29 do
FMemSL.Add(IntToStr(i1) + '.' + IntToStr(i2) + '.' + IntToStr(i3) + '.' +
IntToStr(i4) + '.' + IntToStr(i5) + '.' + IntToStr(i6));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FMemSL := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FMemSL.Free;
end;

procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
var Data: String);
begin
Data := FMemSL.Strings[Index];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FillMemSL;
ListBox1.Count := FMemSL.Count;
Label1.Caption := IntToStr(FMemSL.Count);
end;

end.
 
哦...原来是我一直都不会用listbox.
多谢了.果然是高手!
 
后退
顶部