Показать сообщение отдельно
  #7  
Старый 27.11.2011, 00:44
U.B.M. U.B.M. вне форума
Новичок
 
Регистрация: 06.10.2011
Сообщения: 94
Версия Delphi: Delphi 7
Репутация: 13
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms, StdCtrls, StrUtils, Math;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//перевод из 10-ной в 2-ную - понадобится в дальнейшем
function dec_to_bin(dec_num : integer) : string;
var
  s : string;
begin
  s := '';
  while dec_num >= 1 do
  begin
    s := IntToStr(dec_num mod 2) + s;
    dec_num := dec_num div 2;
  end;
  dec_to_bin := s;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  dec_view, i, j : integer;
  delta, original, sum, min_sum : real;
  Mas : array of real;
  str : string;
begin
  decimalseparator := '.'; //разделитель после целой части, например, 3.14 (не запятая как обычно)
  Memo1.Clear;
  Memo1.Text := Memo1.Text + AnsiReplaceStr(Edit2.Text, ',', #13#10);

  SetLength(Mas, Memo1.Lines.Count);
  for i := 0 to Memo1.Lines.Count-1 do
    Mas[i]:= StrToFloat(Memo1.Lines.Strings[i]);

  Memo1.Text := 'Собираем число '+ Edit1.Text + #13#10 +
                'Из чисел:' + #13#10 +
                Memo1.Text + #13#10 +
                '--------------------------------' + #13#10;

  original := StrToFloat(Edit1.Text);

  dec_view := trunc(Power(2,Length(Mas))); // кол-во комбинаций при сложении
  delta := original;

  for i := 1 to dec_view - 1 do
  begin
    sum := 0;
    for j := 0 to length(dec_to_bin(i))-1 do
      sum := sum + Mas[j]*StrToFloat(copy(dec_to_bin(i),j+1,1));

    if abs(sum-original) < delta   then
    begin
      delta := abs(sum-original);
      min_sum := sum;
      str := dec_to_bin(i);
    end;
    if sum-original = 0 then
    break;
  end;

  Memo1.Lines.Add('Cкладывались числа:');
  for i := 0 to length(str)-1 do
    if str[i+1] <> '0' then
  Memo1.Lines.Add(FloatToStr(Mas[i]));
  Memo1.Lines.Add('сумма = ' + FloatToStr(min_sum));
  Memo1.Lines.Add('разность = ' + FloatToStr(delta));
end;

end.

Полностью рабочий код, кроме того что разность пишет, например, не 1.2, а 1.999999999999. Надо маленько подрехтовать, но тут сам уже разберешься.
Ответить с цитированием