Исходник работает так:
-В поле Edit1 вводится произвольное целое число;
-В поле Edit2 вводятся произвольное множество целых чисел через запятую;
-При нажатии на кнопку Button1 в поле Memo1 выводится сумма целых чисел из ряда Edit2 максимально приблеженных к числу введеного в поле Edit2.
Задача
Необходимо переделать под поиск оптимальной суммы вещественных чисел с наименьшей погрешностью, хотябы до 4 знака после запятой?
Помогите решить эту задачу. Заранее спасибо.
Код:
procedure TForm1.Button1Click(Sender: TObject);
VAR
I, J : Integer;
N, V : Cardinal;
S, Sm : AnsiString;
MaxS : Cardinal;
Variants: TStringList;
Current : Cardinal;
Original : Integer;
Mas : ARRAY OF Integer;
begin
Memo1.Clear;
Memo1.Lines.Add('Собираем число: '+Edit1.Text);
S:= Edit2.Text;
N:= 1;
FOR I:= 1 TO Length(S) DO
IF S[i] = ',' THEN
Inc(N);
SetLength(Mas, N);
N:= 0;
Memo1.Lines.Add('Из чисел: '+Edit1.Text);
REPEAT
I:= Pos(',', S);
IF I = 0 THEN
Mas[N]:= StrToInt(S)
ELSE Begin
Mas[N]:= StrToInt(Copy(S, 1, I-1));
S:= Copy(S, I+1,Length(S));
End;
Memo1.Lines.Add(IntToStr(Mas[N]));
Inc(N);
UNTIL I = 0;
FOR I:= 0 TO N-1 DO Begin
V:= I;
FOR J:= I+1 TO N-1 DO Begin
IF Mas[J] < Mas[V] THEN
V:= J;
End;
J:= Mas[i];
Mas[i]:= Mas[V];
Mas[V]:= J;
End;
Memo1.Lines.Add('------------');
Original:= StrToInt(Edit1.Text);
FOR I:= 0 TO N-1 DO Begin
IF Mas[i] > Original THEN Begin
N:= I;
break;
End;
Memo1.Lines.Add(IntToStr(Mas[i]));
End;
Mas:= Copy(Mas, 0, N);
Memo1.Lines.Add('------------');
Current:= 0;
MaxS:= (1 shl N)-1;
Variants:= TStringList.Create;
Variants.AddObject('0', TObject(0));
REPEAT
Inc(Current);
J:= 0;
Sm:= '';
V:= 1;
FOR I:= 0 TO N-1 DO Begin
IF (Current and V) > 0 THEN Begin
J:= J+Mas[i];
Sm:= Sm+IntToStr(Mas[i])+' + ';
End;
V:= V shl 1;
End;
Sm[Length(Sm)-1]:= '=';
Sm:= Sm+IntToStr(J);
IF Integer(Variants.Objects[0]) = J THEN
Variants.AddObject(Sm, TObject(J))
ELSE IF (J > Integer(Variants.Objects[0])) AND (J <= Original) THEN Begin
Variants.Clear;
Variants.AddObject(Sm, TObject(J))
End;
UNTIL Current = MaxS;
Memo1.Lines.AddStrings(Variants);
end;