主题:[讨论]关于Ax^2+Bx+C=0一元二次方程之因式分解
将一元二次方程ax^2+bx+c=0转化成另一缺一次项
之一元二次方程之过程如下:
ax^2+bx+c=0;
得 x^2+(b/a)x+c/a=0;(1)
设 x=y-b/2a;
代入(1)后,展开得:
y^2-(b/a)y+(b/2a)^2+(b/a)y-0.5*(b/a)^2+c/a=0;
即 y^2-(b/2a)^2+c/a=0;
此后整理得 y=((b/2a)^2-c/a)^(1/2);
进而可求x,得ax^2+bx+c=0之一根。
再由韦达定理有:x1+x2=-b/a;
x1*x2=c/a;
(x1为上述方程组之一根,x2为上式方程之二根);
从中代入已求得之x,可解得第二根;
又可推导出 ax^2+bx+c=a(x^2+(b/a)*x+c/a)=a[x^2-(x1+x2)x+x1*x2];
可以得ax^2+bx+c=a(x-x1)*(x-x2);
从而找出一个因式分解方案;
或设将 ax^2+bx+c (2)
因式分解后之形式为
(sx-t)(nx-k);
将此式展开后与(2)恒等对照,列出方程:
sn=a;
sk+tn=-b;
kt=c;
因本方程组中含四未知数,且等式有三,形式各不一;
故若需因式分解上式(2),可取任一数于s,n,t或k;
而后亦可得任一种分解方案;
然今有一题,要将形如ax^2+bx+c=0之方程分解成(sx-t)(nx-k)之形式,
其中s,n,t,k均为整数,若不可按要求分解则打印‘no’;
我有一个程序如下(已在shortint范围内逐一验证,基本通过),
望大家能从中挑出不足,批评指出,共同研讨:
var a,b,c,i,j,x1,x2,m,n:longint;
s1,s2:string;
function t(a,b:longint):longint;
var j:longint;
begin
repeat
j:=a;
a:=b;
a:=a mod j;
b:=j;
until a=0;
t:=j;
end;
begin
while not(eof)do begin
readln(a,b,c);
s1:='x-';s2:='x-';
if (sqr(b)-4*a*c<0)or(sqrt(sqr(b)-4*a*c)
<>trunc(sqrt(sqr(b)-4*a*c)))then begin
writeln('No');
halt;
end else begin
x1:=trunc(-b+sqrt(sqr(b)-4*a*c));
x2:=trunc(-b-sqrt(sqr(b)-4*a*c));
i:=abs(2*a) div t(abs(x1),abs(2*a));
j:=abs(2*a) div t(abs(x2),abs(2*a));
if (a/i/j=trunc(a/i/j))and(a/j=trunc(a/j))and(a/i=trunc(a/i))then begin
if a div j<0 then n:=-1 else n:=1;
if a div i div j*(x1 div t(abs(x1),abs(2*a)))<0 then m:=-1 else m:=1;
if n*m=-1 then s1[2]:='+' else s1[2]:='-';
if x2/2/a<0 then s2[2]:='+';
write('(');
if a div j<>1 then write(a div j);
write(s1,abs(a div i div j*(x1 div t(abs(x1),abs(2*a)))),')(');
if j<>1 then write(j);
write(s2,abs(x2 div t(abs(x2),abs(2*a))),')');
writeln;
end else writeln('No');
end;
end;
end.
之一元二次方程之过程如下:
ax^2+bx+c=0;
得 x^2+(b/a)x+c/a=0;(1)
设 x=y-b/2a;
代入(1)后,展开得:
y^2-(b/a)y+(b/2a)^2+(b/a)y-0.5*(b/a)^2+c/a=0;
即 y^2-(b/2a)^2+c/a=0;
此后整理得 y=((b/2a)^2-c/a)^(1/2);
进而可求x,得ax^2+bx+c=0之一根。
再由韦达定理有:x1+x2=-b/a;
x1*x2=c/a;
(x1为上述方程组之一根,x2为上式方程之二根);
从中代入已求得之x,可解得第二根;
又可推导出 ax^2+bx+c=a(x^2+(b/a)*x+c/a)=a[x^2-(x1+x2)x+x1*x2];
可以得ax^2+bx+c=a(x-x1)*(x-x2);
从而找出一个因式分解方案;
或设将 ax^2+bx+c (2)
因式分解后之形式为
(sx-t)(nx-k);
将此式展开后与(2)恒等对照,列出方程:
sn=a;
sk+tn=-b;
kt=c;
因本方程组中含四未知数,且等式有三,形式各不一;
故若需因式分解上式(2),可取任一数于s,n,t或k;
而后亦可得任一种分解方案;
然今有一题,要将形如ax^2+bx+c=0之方程分解成(sx-t)(nx-k)之形式,
其中s,n,t,k均为整数,若不可按要求分解则打印‘no’;
我有一个程序如下(已在shortint范围内逐一验证,基本通过),
望大家能从中挑出不足,批评指出,共同研讨:
var a,b,c,i,j,x1,x2,m,n:longint;
s1,s2:string;
function t(a,b:longint):longint;
var j:longint;
begin
repeat
j:=a;
a:=b;
a:=a mod j;
b:=j;
until a=0;
t:=j;
end;
begin
while not(eof)do begin
readln(a,b,c);
s1:='x-';s2:='x-';
if (sqr(b)-4*a*c<0)or(sqrt(sqr(b)-4*a*c)
<>trunc(sqrt(sqr(b)-4*a*c)))then begin
writeln('No');
halt;
end else begin
x1:=trunc(-b+sqrt(sqr(b)-4*a*c));
x2:=trunc(-b-sqrt(sqr(b)-4*a*c));
i:=abs(2*a) div t(abs(x1),abs(2*a));
j:=abs(2*a) div t(abs(x2),abs(2*a));
if (a/i/j=trunc(a/i/j))and(a/j=trunc(a/j))and(a/i=trunc(a/i))then begin
if a div j<0 then n:=-1 else n:=1;
if a div i div j*(x1 div t(abs(x1),abs(2*a)))<0 then m:=-1 else m:=1;
if n*m=-1 then s1[2]:='+' else s1[2]:='-';
if x2/2/a<0 then s2[2]:='+';
write('(');
if a div j<>1 then write(a div j);
write(s1,abs(a div i div j*(x1 div t(abs(x1),abs(2*a)))),')(');
if j<>1 then write(j);
write(s2,abs(x2 div t(abs(x2),abs(2*a))),')');
writeln;
end else writeln('No');
end;
end;
end.