unit NarcissisticnumberU;
interface
uses Classes, System.SysUtils, math ;
type
TNarcissisticnumbeThread=class;//定义一个水仙花数类
TOnRuned =procedure(sender:TNarcissisticnumbeThread ) of object;//方法过程
TNarcissisticnumbeThread=class(TThread)
protected
procedure Execute; override;
public
BeginNum:integer;//初始值
EndNum:integer;//终止值
NarcissisticNum:STRING ;// 水仙花数
onRuned: TOnRuned
end ;
implementation
procedure TNarcissisticnumbeThread.Execute;
var
x,s,e:LongInt;
i,j,m,L,d :integer;
st:string;
begin
NarcissisticNum:='';
for x:=BeginNum to EndNum do
begin
str(x,st) ; L:=length(st) ; S:=0;
for i :=1 to L do
begin
e:=1;
val(st[i],m,d);
for j := 1 to L do
e:=e*m;
s:=s+e;
end;// for i :=1 to L do
if x=s then NarcissisticNum:=NarcissisticNum +X.ToString +#13+#10;
end; // for x:=BeginNum to EndNum do
if assigned(onRuned) then
onRuned(self)
end;
end.
/
unit UNarcissisticnumbe;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, NarcissisticnumberU ;
type
TTFrmMain = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
lStart, lEnd : Longint;
procedure ShowRunTime(const lTime : Longint);
procedure onRuned(Sender:TNarcissisticnumbeThread ) ;
public
{ Public declarations }
end;
var
TFrmMain: TTFrmMain;
implementation
{$R *.dfm}
procedure TTFrmMain.Button1Click(Sender: TObject);
var
MYThread: TNarcissisticnumbeThread;
begin
MYThread := TNarcissisticnumbeThread.Create(true);
MYThread.onRuned:= self.onRuned; //指定事件。
MYThread.FreeOnTerminate := true; // 线程结束后自动释放
MYThread.BeginNum := 100;
MYThread.EndNum:=9999999;
MYThread.Start;
lStart := GetTickCount;
end;
procedure TTFrmMain.onRuned(Sender: TNarcissisticnumbeThread);
begin
TThread.Synchronize(nil,
procedure
begin
memo1.Lines.Text:=(sender.NarcissisticNum) ;
lEnd := GetTickCount;
ShowRunTime(lEnd - lStart);
end);
end;
procedure TTFrmMain.ShowRunTime(const lTime: Integer);
begin
memo1.Lines.Add(FloatToStr(lTime / 1000.0) + '秒');
end;
end.