使用1..9这9个数字组成一个“两位数×三位数=四位数”的等式,其中各个数字不能重复。

xiaocongzhi 2011-04-12 07:57:43
使用1..9这9个数字组成一个“两位数×三位数=四位数”的等式,其中各个数字不能重复。
我做了一个程序,不过我觉得不太好,各位有何高招?
附上我的源码:

unit uDataArr;

interface
type
TDataArr=array[0..8] of Byte;
RReturn=record
Data2:Integer;
Data3:Integer;
i:Integer;
j:Integer;
m:Integer;
n:Integer;
p:Integer;
Relt:Integer;
end;
RReturnArr=array of RReturn;
const
DataArr:TDataArr=(1,2,3,4,5,6,7,8,9);
var
RetDataArr:RReturnArr;
implementation

end.


unit uMainForm;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure TwoData;
procedure ThreeData( i:integer; j: integer;out RetData: RReturn);
function ResultAnly(const Data:RReturn):Boolean;
function JudRe(x:integer;const Data:RReturn):Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function TForm1.JudRe(x: integer; const Data: RReturn): Boolean;
begin
if not( x in [Data.i,Data.j,Data.m,Data.n,Data.p]) then
result:=true
else
result:=false;
end;

function TForm1.ResultAnly(const Data:RReturn):Boolean;
var
a,b,c,d:Integer;
begin
Result:=true;
a:=(Data.Relt)div 1000;
b:=(Data.Relt-a*1000)div 100;
c:=(Data.Relt-a*1000-b*100)div 10;
d:=(Data.Relt-a*1000-b*100-c*10);
if ((a*b*c*d)=0) then
begin
Result:=false;
exit;
end;

if (not (a in [b,c,d]))and(not (b in [a,c,d])) and(not (c in [a,b,d]))
and(not (d in [a,b,c])) then
begin
if not JudRe(a-1,Data) then
begin
Result:=False;
Exit;
end;
if not JudRe(b-1,Data) then
begin
Result:=False;
Exit;
end;
if not JudRe(c-1,Data) then
begin
Result:=False;
Exit;
end;
if not JudRe(d-1,Data) then
begin
Result:=False;
Exit;
end;
end else
begin
Result:=False;
end;
end;

procedure TForm1.ThreeData(i:integer; j: integer; out RetData: RReturn);
var
m,n,p:integer;

begin
for m:=0 to Length(DataArr)-1 do
begin
if (m in [i,j]) then continue;
for n:=0 to Length(DataArr)-1 do
begin
if (n in [m,i,j]) then continue;
for p:=0 to Length(DataArr)-1 do
begin
if (p in [m,n,i,j]) then continue;
RetData.Data3:=DataArr[m]*100+DataArr[n]*10+DataArr[p];
RetData.m:=m;RetData.n:=n;RetData.p:=p;
RetData.i:=i;RetData.j:=j;
RetData.Relt:=RetData.Data2*RetData.Data3;
if ((RetData.Relt<1000)or(RetData.Relt>9999)) then continue;
if ResultAnly(RetData) then
begin
Setlength(RetDataArr,Length(RetDataArr)+1);
RetDataArr[Length(RetDataArr)-1]:=RetData;
//ShowMessage(IntToStr(RetData.Data2)+' '+IntToStr(RetData.Data3)+' '+IntToStr(RetData.Relt));
//exit;
end;
end;
end;
end;
end;

procedure TForm1.TwoData;
var
i,j,Index:integer;
Data:RReturn;
ReStr:String;
begin
Finalize(RetDataArr);
ReStr:='';
for i:=0 to Length(DataArr)-1 do
begin
for j:=0 to Length(DataArr)-1 do
if i<>j then
begin
Data.Data2:=(DataArr[i]*10+DataArr[j]);
ThreeData(i,j,Data) ;
end;
end;
for Index:=0 to Length(RetDataArr)-1 do
begin
ReStr:=ReStr+#13#10+IntToStr(RetDataArr[Index].Data2)+' '+IntToStr(RetDataArr[Index].Data3)+' '+IntToStr(RetDataArr[Index].Relt);
end;
ShowMessage(ReStr);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TwoData;
end;
...全文
403 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocongzhi 2011-04-14
  • 打赏
  • 举报
回复
哪位仁兄还有别的方法吗?
xiaocongzhi 2011-04-13
  • 打赏
  • 举报
回复
红叶兄果然高明,把数值转换为字符串处理!
hongss 2011-04-13
  • 打赏
  • 举报
回复
Allanlove 2011-04-12
  • 打赏
  • 举报
回复

var
i,n,g:integer;
s,s1,s2 :string;
b:boolean;
begin
for i := 10 to 99 do
for n:= 100 to 999 do
begin
b :=True;
s := IntToStr(i * n);
if Length(s)= 4 then
begin
s1 := IntToStr(i);
s2 := IntToStr(n);
s := s1 + '*' + s2 + ' = '+ s;
for g:= 1 to 9 do
begin
if Pos(IntToStr(g),s) < 1 then
begin
b :=False;
Break;
end;
end;
if b then
Memo1.Lines.Add(s);
end
else
Break;
end;
end;
Allanlove 2011-04-12
  • 打赏
  • 举报
回复
for i := 10 to 99 do
for n:= 100 to 999 do
begin
b :=True;
s := IntToStr(i * n);
if Length(s)= 4 then
begin
s1 := IntToStr(i);
s2 := IntToStr(n);
s := s1 + '*' + s2 + ' = '+ s;
for g:= 1 to 9 do
begin
if Pos(IntToStr(g),s) < 1 then
b :=False;
end;
if b then
Memo1.Lines.Add(s);

end;
end;
xiaocongzhi 2011-04-12
  • 打赏
  • 举报
回复
我的程序运行结果为:
12 483 5796
18 297 5346
27 198 5346
28 157 4396
39 186 7254
42 138 5796
48 159 7632

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧