最笨的办法:如果都是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
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;
我是一名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.
if (i>m/2*i)and(i<m/i) then
begin
if m mod i=0 then
list.items.add i
end
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;
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.