下边是我写的代码,请教有没有更好的算法。
请大家都来参与,说说自己的想法!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;

解决方案 »

  1.   

    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;
    这一段是不是可以采用折半算法。
      

  2.   

    for i:=Length(myArr) downto 0 do
      begin
        if n>=myArr[i] then
        begin
          for k:=0 to i do
          begin
              Memo2.Lines.Add(IntToStr(myArr[k]));
          end;
          Break;
        end;
      end;
      

  3.   

    我想要的是
      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;
    这断代码的更好的算法自己顶
      

  4.   

    function  GetArr(Num:integer):string;
    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;
      

  5.   

    jinjazz(近身剪(充电中...)) 果然高
      

  6.   

    procedure TForm1.Button2Click(Sender: TObject);
    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;
      

  7.   

    想请教jinjazz(近身剪(充电中...))俩种算法在效率上会有差别嘛?
      

  8.   

    to jinjazz,最近在研究冰封王座,很少上来看