问题是:
总数是M(例如说1000),请给我几种算法,提供一个N(比如说10),将M分成N个数字,这N个数字加起来为M,而且这些数字都大于0,且在   M/(2*N)和 2M/N 之间。

解决方案 »

  1.   

    最笨的办法:如果都是integer就行!for i:=2 to m-1 do
      if (i>m/2*i)and(i<m/i) then
      begin
        if m mod i=0 then
         list.items.add i
      end
      

  2.   

    procedure divTest(m,n:integer;result:Tstrings);
    begin
      Result.Add(Inttostr(m div n));
      if n=1 then exit;
      divTest(m-(m div n),n-1,result)
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      divtest(100,2,memo1.Lines)
    end;
      

  3.   

    我是一名noi教练,今天恰好路过此地,偶然看到这个问题,举手之劳写了一个,如果用TurboPascal解决的话,应该是这样的:(这个算法可以列出所有可能的方案,有重复数字,稍作修改,就可以去掉重复数字,而且,我觉得,这个代码整理一下输入输出部分,在delphi下应该是没有问题的)
    program SplitM;var
      d: array [1..1000] of Integer;
      m,n,min,max: Integer;procedure WriteOut;
    var
      i: Integer;
    begin
      for i:=1 to n do
        Write(d[i]:4);
      Writeln;
    end;procedure Search(Index, Total: Integer);
    var
      i: Integer;
    begin
      if Index=n then
      begin
        if (m-Total>=d[Index-1]) and (m-Total<=max) then
        begin
          d[Index] := m-Total;
          WriteOut;
        end;
        Exit;
      end;  for i:=d[Index-1] to (m-Total) div (n-Index) do
      begin
        d[Index]:=i;
        Search(Index+1, Total+i);
      end;
    end;var
      i: Integer;
    begin
      Writeln('Please put m:');
      Readln(m, n);
      min := m div (2 * n);
      max := 2 * m div n;  for i:=min to max do
      begin
        d[1]:=i;
        Search(2, i);
      end;end.