任意给出0-9中的4个数,可重复,加减乘除算24,每数只能而且必须用一次。!就是以前小时候玩的游戏,请大家给点意见!或者给点原代码!谢谢![email protected]

解决方案 »

  1.   

    http://xmsh.l78.bizcn.com/ahong/download/2436p.zip
      

  2.   

    (*//
    标题:类似计算加减乘除二十四的算法
    说明:参考 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;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;
    ///////End Source///////Begin Demo
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Edit1.Text := SearchExpression([5, 5, 5, 1], 24);
    end;
    ///////End Demo
      

  3.   

    //伴水老兄修改的代码unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Edit4: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}///////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;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;
    function t_t(s_s:string):string;
    var hint:integer;
    begin
       hint:=length(s_s);
       if (s_s[1]='(')and(s_s[hint]=')') then
       begin
          s_s:=copy(s_s,2,hint-2);
          t_t(s_s);
       end;
      result:=s_s;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var s:string;
        t1,t2,t3,t4:integer;
    begin
      t1:=strtoint(edit1.text);
      t2:=strtoint(edit2.text);
      t3:=strtoint(edit3.text);
      t4:=strtoint(edit4.text);
      s:=SearchExpression([t1,t2,t3,t4], 24);
      if s='' then s:='提示:此次无解'
      else
      begin
       s:=t_t(s);
       s:=s+' =24';
       memo1.lines.add('本次有解:');
       memo1.lines.add(s);
      end;
    end;end.