sub最小优先:
procedure TForm1.Button1Click(Sender: TObject);
var
i,n,m,k,min,d:Integer;
begin
n:=SpinEdit1.Value;
Memo1.Text:=Format('Aim:%6d'#13#10#13#10,[n]);
m:=Trunc(Sqrt
);
min:=n;
i:=m;
k:=0;
while i>=1do
begin
k:=n div i;
d:=n-i*k;
if d<min then
begin
min:=d;
Memo1.Lines.Add(Format('a:%6d b:%6d sub:%3d',[i,k,d]));
if d=0 then
break;
end;
Dec(i);
end;
Memo1.Lines.Add(Format(#13#10'Result: a:%6d b:%6d',[i,k]));
end;
eg:
Aim:2345671
a: 1531 b: 1532 sub:179
a: 1495 b: 1569 sub: 16
a: 1286 b: 1824 sub: 7
a: 1206 b: 1945 sub: 1
a: 191 b: 12281 sub: 0
Result: a: 191 b: 12281
综合方案:
sub+|a-b| 最小。
procedure TForm1.Button2Click(Sender: TObject);
var
i,n,m,k,min,d1,d2,d,mi,mk:Integer;
begin
n:=SpinEdit1.Value;
Memo1.Text:=Format('Aim:%6d'#13#10#13#10,[n]);
m:=Trunc(Sqrt
);
min:=n;
i:=m;
mk:=0;
mi:=0;
while i>=1do
begin
k:=n div i;
d1:=n-i*k;
d2:=k-i;
if d2>min then
break;
d:=d1+d2;
if d<min then
begin
min:=d;
mi:=i;
mk:=k;
Memo1.Lines.Add(Format('a:%6d b:%6d sub:%3d a-b:%3d sum:%3d',[i,k,d1,d2,d]));
end;
Dec(i);
end;
Memo1.Lines.Add(Format(#13#10'Result: a:%6d b:%6d',[mi,mk]));
end;
eg:
Aim:234567
a: 484 b: 484 sub:311 a-b: 0 sum:311
a: 471 b: 498 sub: 9 a-b: 27 sum: 36
Result: a: 471 b: 498