在算法论坛看到很多讨论24点算法的帖子,全部都是用C写的,大家能不能用delphi写出同样的算法。
解决方案 »
- 怎样对指定的一个文件夹进行遍历?遍历的对象包括子目录和文件,并将筛选出的文件地址存放进 Listbox 或者 Tstringlist 对象实例里
- 大家帮帮忙看这是怎么回事?
- 哼哼,日本龟儿子删贴了
- 简单问题:如何选定一个listview里的指定项(让它变蓝)
- Delphi能否调用EJB等中间件?
- Delphi中用ADO调Sql server数据库,但是有的机器连不上数据库,为什么?
- 如何实现URL拖拽?
- 关于ADOQuery的变量赋值问题
- ADOConnection Oracle
- 关于多线程的一个问题,suspend之后再,resume为什么挂起的线程不能继续执行
- 菜问题!:d
- 怎样判断字符串中有汉字?
看看语法,然后翻译就行了
要转换还不简单……
哪怕是FORTRAN或者ADA,COBOL,都是可以做的……
看见你的1点信誉就有删除你的冲动……
而且既然这么简单的话,还没有一个人翻译过来贴上来的。
标题:类似计算加减乘除二十四的算法
说明:参考http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=422
修改:Zswang
日期:2003-03-17
支持:[email protected]
//*)///////Begin Source
function SearchExpression(mNumbers: array of Integer;
mDest: Integer): string;
const
cPrecision = 1E-6;var
vNumbers: array of Extended;
vExpressions: array of string;
vLength: Integer; function fSearchExpression(mLevel: Integer): Boolean;
var
I, J: Integer;
A, B: Extended;
vExpA, vExpB: string;
begin
Result := True;
if (mLevel <= 1) and (Abs(vNumbers[0] - mDest) <= cPrecision) then Exit; for I := 0 to mLevel - 1 do begin
for J := I + 1 to mLevel - 1 do begin
A := vNumbers[I];
B := vNumbers[J];
vNumbers[J] := vNumbers[mLevel - 1]; vExpA := vExpressions[I];
vExpB := vExpressions[J];
vExpressions[J] := vExpressions[mLevel - 1]; vExpressions[I] := '(' + vExpA + '+' + vExpB + ')';
vNumbers[I] := A + B;
if fSearchExpression(mLevel - 1) then Exit;
vExpressions[I] := '(' + vExpA + '-' + vExpB + ')';
vNumbers[I] := A - B;
if fSearchExpression(mLevel - 1) then Exit;
vExpressions[I] := '(' + vExpB + '-' + vExpA + ')';
vNumbers[I] := B - A;
if fSearchExpression(mLevel - 1) then Exit;
vExpressions[I] := '(' + vExpA + '*' + vExpB + ')';
vNumbers[I] := A * B;
if fSearchExpression(mLevel - 1) then Exit;
if B <> 0 then begin
vExpressions[I] := '(' + vExpA + '/' + vExpB + ')';
vNumbers[I] := A / B;
if fSearchExpression(mLevel - 1) then Exit;
end;
if A <> 0 then begin
vExpressions[I] := '(' + vExpB + '/' + vExpA + ')';
vNumbers[I] := B / A;
if fSearchExpression(mLevel - 1) then Exit;
end;
vNumbers[I] := A;
vNumbers[J] := B;
vExpressions[I] := vExpA;
vExpressions[J] := vExpB;
end;
end;
Result := False;
end; { fSearchExpression }var
I: Integer;
begin
vLength := Length(mNumbers);
SetLength(vNumbers, vLength);
SetLength(vExpressions, vLength);
for I := 0 to vLength - 1 do begin
vNumbers[I] := mNumbers[I];
vExpressions[I] := IntToStr(mNumbers[I]);
end;
if fSearchExpression(vLength) then
Result := vExpressions[0]
else Result := '';
vNumbers := nil;
vExpressions := nil;
end; { SearchExpression }
///////End Source///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := SearchExpression([7, 7, 4, 4], 24);
end;
///////End Demo
达到算法的功能,但还有些地方需要完善。
1.输入1,2,3,4而返回的表达式为(((1+2)+3)*4)没有将多余的括号去掉。
2.没有将所有的表达式列出。
3.在将所有的表达式列出后,将重复的表达式过滤等。
function CheckExpression(vExpS: String): String;
var
vLengthExpS:Integer;
begin
vLengthExpS:=Length(vExpS);
Result:=Copy(vExps,2,vLengthExps-2);
end;procedure TForm1.SearchExpression(mNumbers: array of Integer;
mDest: Integer);
const
cPrecision = 1E-6;var
vNumbers: array of Extended;
vExpressions: array of string;
vLength: Integer; function fSearchExpression(mLevel: Integer): Boolean;
var
I, J: Integer;
A, B: Extended;
vExpA, vExpB: string;
begin
Result := True;
if (mLevel <= 1) and (Abs(vNumbers[0] - mDest) <= cPrecision) then Exit; for I := 0 to mLevel - 1 do begin
for J := I + 1 to mLevel - 1 do begin
A := vNumbers[I];
B := vNumbers[J];
vNumbers[J] := vNumbers[mLevel - 1]; vExpA := vExpressions[I];
vExpB := vExpressions[J];
vExpressions[J] := vExpressions[mLevel - 1]; vExpressions[I] := '(' + vExpA + '+' + vExpB + ')';
vNumbers[I] := A + B;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
vExpressions[I] := '(' + vExpA + '-' + vExpB + ')';
vNumbers[I] := A - B;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
vExpressions[I] := '(' + vExpB + '-' + vExpA + ')';
vNumbers[I] := B - A;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
vExpressions[I] := '(' + vExpA + '*' + vExpB + ')';
vNumbers[I] := A * B;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
if B <> 0 then begin
vExpressions[I] := '(' + vExpA + '/' + vExpB + ')';
vNumbers[I] := A / B;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
end;
if A <> 0 then begin
vExpressions[I] := '(' + vExpB + '/' + vExpA + ')';
vNumbers[I] := B / A;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
end;
vNumbers[I] := A;
vNumbers[J] := B;
vExpressions[I] := vExpA;
vExpressions[J] := vExpB;
end;
end;
Result := False;
end; { fSearchExpression }var
I: Integer;
begin
vLength := Length(mNumbers);
SetLength(vNumbers, vLength);
SetLength(vExpressions, vLength);
for I := 0 to vLength - 1 do begin
vNumbers[I] := mNumbers[I];
vExpressions[I] := IntToStr(mNumbers[I]);
end;
if fSearchExpression(vLength) then
Memo1.Lines.Add( vExpressions[0]); vNumbers := nil;
vExpressions := nil;
end; { SearchExpression }
///////End Source///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
SearchExpression([1, 2, 3, 4], 24);
if Memo1.Lines.Count>0 then
showmessage('成功计算出结果,请核对!')
else
showmessage('不能计算出结果,请重新出题!');
end;
http://bbs.2ccc.com/uploads/fj218/card24.rar