如题

解决方案 »

  1.   

    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;procedure TForm1.Button1Click(Sender: TObject);
    begin
       Edit1.Text := SearchExpression([1, 2, 3, 4, 5], 22);
    end;
      

  2.   

    1. 如果是2个数字A1和A2,以及1个运算符opt,那么有效的表达式无非是A1 opt A2或A2 opt A1。
    然后就比较哪个结果是LZ需要的就可以了。
    2. 如果是3个数字A1,A2和A3,以及2个运算符,那么可以任意取2个数字和一个运算符作运算,然后就变成了1的情况了。因此可以用递归的方法来解决吧。
    3. 如果不能用括号的话,那么就先处理优先级高的运算符。
    编程应该不难,就是程序可能长点。
      

  3.   

    以下是运算过程,用C++写的(我在以前别人一个算24的程序改了一下)
    //主要是用穷举!给你参考一下:
    #include  <iostream>  
    #include  <string>  
    #include  <cmath>  
    using  namespace  std;  
     
    const  double  PRECISION  =  1E-6;  
    const  int  COUNT_OF_NUMBER    =  5;  
    const  int  NUMBER_TO_BE_CAL  =  22;  
     
    double  number[COUNT_OF_NUMBER];  
    string  expression[COUNT_OF_NUMBER]; bool result=false; 
     
    bool Search(int n)  
    {
    if  (n  ==  1)
    {
    if( fabs(number[0] - NUMBER_TO_BE_CAL) < PRECISION  )
    {
    if (expression[0].find('+')!=-1)
    if (expression[0].find('-')!=-1)
    if (expression[0].find('*')!=-1)
    if (expression[0].find('/')!=-1) 
      cout  <<  expression[0]  <<  endl; 
    result=true; 
    }  
    else 
    {  
    return  false;  
    }  
        }  
    for  (int  i  =  0;  i  <  n;  i++)
    {
    for(int  j  =  i  +  1;  j  <  n;  j++) 
    {
    double  a,  b; 
    string  expa,  expb;  
    a  =  number[i];  
    b  =  number[j];  
    number[j]  =  number[n  -  1];     
    expa  =  expression[i];  
    expb  =  expression[j];  
    expression[j]  =  expression[n  -  1]; 
    expression[i] = '(' + expa + '+' + expb + ')'; 
    number[i]  =  a  +  b;  
    if  (  Search(n  -  1)  )  return true;;  
    expression[i] = '(' + expa + '-' + expb + ')'; 
    number[i]  =  a  -  b;  
    if  (  Search(n  -  1)  )   return true;;
    expression[i] = '(' + expb + '-' + expa + ')';
    number[i]  =  b  -  a;  
    if  (  Search(n  -  1)  )   return true;;                             
                expression[i] = '(' + expa +  '*' + expb + ')'; 
    number[i]  =  a  *  b;  
    if  (  Search(n  -  1)  )  return true;;
    if  (b  !=  0) 
    {
    expression[i]= '(' + expa + '/' + expb + ')';  
    number[i]  =  a  /  b;  
    if  (  Search(n  -  1)  )   return true;; 
    }  
    if  (a  !=  0) 
    {  
    expression[i] = '(' + expb + '/' + expa + ')';  
    number[i]  =  b  /  a;  
    if  (  Search(n  -  1)  )   return true;;
    }  

    number[i]  =  a;  
    number[j]  =  b;  
    expression[i]  =  expa;  
    expression[j]  =  expb;  
    }  
    }  
    return  false;  
    }  
     
    void  main()  
    {
    char order = 'y';
    while(order == 'y'||order == 'Y')
    {
    cout<<endl<<"Please input four numbers:"; for  (int i = 0; i < COUNT_OF_NUMBER; i++) 
    {
    char  buffer[20];
    int    x;  
    cin >> x;  
    number[i]  =  x;  
    itoa(x,  buffer,  10);  
    expression[i]  =  buffer;
    }
    Search(COUNT_OF_NUMBER);
    if (result)
    cout  <<  "Success."  <<  endl;
    else  
    cout  <<  "Fail."  <<  endl;
    cout<<"Are sure to continue(y/n):";
    cin>>order;      
    }
    }  
      

  4.   

    cuteant(我这张旧船票还能否登上你的破船|涛声是否依旧) (
    但是楼主没有说可以用括号啊
    虽然楼主也没有说不可以用括号,呵呵汗一个~~
    那楼主也没说不能算错^_^
      

  5.   

    (((5-1)+(3/2))*4) //重复1
    ((5-1)*((3/2)+4)) //重复2
    ((((3/2)-1)+5)*4)
    (((5-1)+(3/2))*4) //重复1
    ((5-1)*((3/2)+4)) //重复2
    ((((3/2)+5)-1)*4)
    ((5-1)*((3/2)+4)) //重复2看到keiy()的答案和程序,豁然开朗,呵呵
    不过好像有重复答案