回 帖 发 新 帖 刷新版面

主题:[讨论]关于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.

回复列表 (共2个回复)

沙发

~~~~~~~~~~~~~~~~~~~~~你的论述毫无因果关系,且错漏百出.........

板凳

这个我试过了
蛮好的
不过这种简单的十字相乘只要懂点数学的都会呀
要这个有什么意义呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册