如题
解决方案 »
- 如何将一个无类型指针中字节型数据转换成string显示出来?急!!!谢谢!!!
- DBGrid 能否实现折行显示?
- 请问打印数据时生成时的.spl文件格是是如何的?
- 今年考研失败了,想出去打工,心里有点慌,各位可以给点建议吗?
- 一个非常奇怪的问题,那位帮我解决,另外开贴子给200分!
- installshield express 4.0哪里有下阿?
- 不知大家都在想什么?我反正想散分了,
- 请问各位:我做了两个数据库连接,可是总是报错,多谢指教。
- 提问怎么没得到好的答案,大家帮帮忙呀
- 尽管来拿分,关于中SQL2000中数据库物理空间的压缩的菜问题
- advstringgrid如何实现向下自动填充
- 怎样获得依赖关系列表
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;
然后就比较哪个结果是LZ需要的就可以了。
2. 如果是3个数字A1,A2和A3,以及2个运算符,那么可以任意取2个数字和一个运算符作运算,然后就变成了1的情况了。因此可以用递归的方法来解决吧。
3. 如果不能用括号的话,那么就先处理优先级高的运算符。
编程应该不难,就是程序可能长点。
//主要是用穷举!给你参考一下:
#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;
}
}
但是楼主没有说可以用括号啊
虽然楼主也没有说不可以用括号,呵呵汗一个~~
那楼主也没说不能算错^_^
((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()的答案和程序,豁然开朗,呵呵
不过好像有重复答案