
27.11.2011, 00:44
|
Новичок
|
|
Регистрация: 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. Надо маленько подрехтовать, но тут сам уже разберешься.
|