下边是我写的代码,请教有没有更好的算法。
请大家都来参与,说说自己的想法!const
myArr : Array[0..10] of Integer = (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024);procedure TForm1.Edit2Exit(Sender: TObject);
var
i: Integer;
begin
try
i := StrToInt(Edit2.Text);
if i>1024 then
begin
Application.MessageBox('输入整数不能大于1024', '提示', MB_OK Or MB_ICONWARNING);
Edit2.Clear;
Edit2.SetFocus;
end;
except
Application.MessageBox('只能输入整数', '提示', MB_OK Or MB_ICONWARNING);
Edit2.Clear;
Edit2.SetFocus;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
i, n, k: Integer;
tempArr: Array of Integer; //中间数组,保存
begin
Memo2.Clear;
n := StrToInt(Edit2.Text);
for i:=Length(myArr) downto 0 do
begin
if n>=myArr[i] then
begin
k := Length(tempArr);
SetLength(tempArr, k + 1);
tempArr[k] := myArr[i];
n := n - myArr[i];
end;
end;
for i:=Length(tempArr)-1 downto 0 do
begin
Memo2.Lines.Add(IntToStr(tempArr[i]));
end;end;
请大家都来参与,说说自己的想法!const
myArr : Array[0..10] of Integer = (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024);procedure TForm1.Edit2Exit(Sender: TObject);
var
i: Integer;
begin
try
i := StrToInt(Edit2.Text);
if i>1024 then
begin
Application.MessageBox('输入整数不能大于1024', '提示', MB_OK Or MB_ICONWARNING);
Edit2.Clear;
Edit2.SetFocus;
end;
except
Application.MessageBox('只能输入整数', '提示', MB_OK Or MB_ICONWARNING);
Edit2.Clear;
Edit2.SetFocus;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
i, n, k: Integer;
tempArr: Array of Integer; //中间数组,保存
begin
Memo2.Clear;
n := StrToInt(Edit2.Text);
for i:=Length(myArr) downto 0 do
begin
if n>=myArr[i] then
begin
k := Length(tempArr);
SetLength(tempArr, k + 1);
tempArr[k] := myArr[i];
n := n - myArr[i];
end;
end;
for i:=Length(tempArr)-1 downto 0 do
begin
Memo2.Lines.Add(IntToStr(tempArr[i]));
end;end;
begin
if n>=myArr[i] then
begin
k := Length(tempArr);
SetLength(tempArr, k + 1);
tempArr[k] := myArr[i];
n := n - myArr[i];
end;
end;
这一段是不是可以采用折半算法。
begin
if n>=myArr[i] then
begin
for k:=0 to i do
begin
Memo2.Lines.Add(IntToStr(myArr[k]));
end;
Break;
end;
end;
n := StrToInt(Edit2.Text);
for i:=Length(myArr) downto 0 do
begin
if n>=myArr[i] then
begin
k := Length(tempArr);
SetLength(tempArr, k + 1);
tempArr[k] := myArr[i];
n := n - myArr[i];
end;
end;
这断代码的更好的算法自己顶
const
myArr : Array[0..10] of Integer = (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024);
var
i:integer;
begin
result:='';
for i:=0 to 10 do
begin
if (Num and myarr[i])<>0 then
result:=result+inttostr(myarr[i])+'+';
end;
if length(result) >1 then
result:=copy(result,1,length(result)-1);
end;
var
I, N: Integer;
begin
Memo2.Clear;
N := StrToIntDef(Edit2.Text, 0);
I := 1;
while N > 0 do
begin
if N mod 2 <> 0 then
Memo2.Lines.Add(IntToStr(I));
I := I * 2;
N := N div 2;
end;
end;