|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Подскажите как переделать это?
Исходник работает так:
-В поле 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; Последний раз редактировалось lmikle, 04.11.2011 в 02:25. |