Показать сообщение отдельно
  #1  
Старый 04.11.2011, 01:20
LelikBolik LelikBolik вне форума
Прохожий
 
Регистрация: 04.11.2011
Сообщения: 9
Репутация: 10
По умолчанию Подскажите как переделать это?

Исходник работает так:
-В поле 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;
Ответить с цитированием