呵呵,不知道我理解的对不对!如果A,B,C都是已经的, 则 |A * X - B * Y| = C 吧绝对值去掉在xy轴表示是什么, 应该是一条确定角度的直线, 然后你可以找到交点!之后的事情你用笔在白纸上画一画,就知道答案了吧!!!应不难解开吧,如果还不会建议你看看《数值计算》这本书!!!
比如: A = 7, B = 9 要實現 兩者的差的絕對值是 1 (即C =1) X = {4, 5.....} Y = {3, 4.....} 而x = 4, y = 3 就是符合|A * X - B * Y| <= C 的最小值了.
問題已經解決,現在結貼,參與有分. 順便把代碼貼出來,看看大家有沒有更好的辦法,或者是否還有可以簡化一下。 procedure TForm1.Button3Click(Sender: TObject); var Max,Min: Double; A,B,C: Double; Proportion,i,j: Integer; IsFind: Boolean; begin IsFind := False; A := StrToFloat(EdA.Text); B := StrToFloat(EdB.Text); C := StrToFloat(EdC.Text); Max := A; Min := B; if B > A then begin Max := B; Min := A; end; if Abs(Max - Min)> C then begin for i :=1 to Round(Min) do begin Proportion := Round((Max * i + C )/ Min); for j := 1 to Proportion do begin if Abs(Min * Proportion - Max * i) <= C then begin Memo1.Text := ''; Memo1.Lines.Add(IntToStr(j +i)); Memo1.Lines.Add(IntToStr(i)); IsFind := True; Break; end; end; if IsFind then Break; end; end; end;
令A>B:function GetResult(const A, B, C: Integer; var x, y: Integer): Integer; var z, t, iy : Integer; begin t := A - B; // z = y-x for z:=1 to A do begin y := Trunc((z*A-C)/t); for iy:=Max(y, z+1) to Trunc((z*A+C)/t) do begin x := iy - z; Result := A*x - B*iy; if((Result<=C)and(Result>=-C))then begin y := iy; Exit; end; end; end; Result := -1; end;
这是什么意思?x的最小值或y的最小值?还是x+y的最小值?
然后你可以找到交点!之后的事情你用笔在白纸上画一画,就知道答案了吧!!!应不难解开吧,如果还不会建议你看看《数值计算》这本书!!!
A = 7, B = 9
要實現 兩者的差的絕對值是 1 (即C =1)
X = {4, 5.....}
Y = {3, 4.....}
而x = 4, y = 3 就是符合|A * X - B * Y| <= C 的最小值了.
順便把代碼貼出來,看看大家有沒有更好的辦法,或者是否還有可以簡化一下。
procedure TForm1.Button3Click(Sender: TObject);
var
Max,Min: Double;
A,B,C: Double;
Proportion,i,j: Integer;
IsFind: Boolean;
begin
IsFind := False;
A := StrToFloat(EdA.Text);
B := StrToFloat(EdB.Text);
C := StrToFloat(EdC.Text);
Max := A;
Min := B; if B > A then
begin
Max := B;
Min := A;
end; if Abs(Max - Min)> C then
begin
for i :=1 to Round(Min) do
begin
Proportion := Round((Max * i + C )/ Min);
for j := 1 to Proportion do
begin
if Abs(Min * Proportion - Max * i) <= C then
begin
Memo1.Text := '';
Memo1.Lines.Add(IntToStr(j +i));
Memo1.Lines.Add(IntToStr(i));
IsFind := True;
Break;
end;
end;
if IsFind then
Break;
end;
end;
end;
var
z, t, iy : Integer;
begin
t := A - B;
// z = y-x
for z:=1 to A do
begin
y := Trunc((z*A-C)/t);
for iy:=Max(y, z+1) to Trunc((z*A+C)/t) do
begin
x := iy - z;
Result := A*x - B*iy;
if((Result<=C)and(Result>=-C))then
begin
y := iy;
Exit;
end;
end;
end;
Result := -1;
end;
说的多明白了呀,不就是平行线段找焦点附件的(x,y)或者平行线到原点距离最近的(x,y)吗? 利用数值计算里的方法 很容易解决注重散列 问题的