根據 三次方程新解法——盛金公式解題法 見/view/1382952.htm#4
編程如下
#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
#include <cmath>
#include <math.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define JINGDU double
#define MYSQRT(x) (JINGDU)sqrt((x))
#define ZERO 10e-6
#define MYSIN(x) (JINGDU)sin((x))
#define MYCOS(x) (JINGDU)cos((x))
#define ARCSIN(x) (JINGDU)asin((x))
#define ARCCOS(x) (JINGDU)acos((x))
JINGDU sqr3(JINGDU x)
{
if(x<0) {x=-x;return -(JINGDU)pow(x,1.0/3);}
else return (JINGDU)pow(x,1.0/3);
}
void x3fun(JINGDU a,JINGDU b,JINGDU c,JINGDU d)
{
JINGDU A=b*b-3*a*c,B=b*c-9*a*d,C=c*c-3*b*d,delta=B*B-4*A*C; //A=b^2-3ac;B=bc-9ad;C=c^2-3bd 總判別式:Δ=B^2-4AC。
JINGDU X1,X2,X3;
if(!A&&!B)//當A=B=0時,方程有壹個三重實根
{
if(a)X1=X2=X3=-b/(3*a);
if(b)X1=X2=X3=-c/b;
if(c)X1=X2=X3=-d/c; //X1=X2=X3=-b/(3a)=-c/b=-3d/c
printf("%8f%8f%8f\n",X1,X2,X3);
JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);
return;
}
if(delta<ZERO&&delta>-ZERO)//當Δ=B^2-4AC=0時,方程有三個實根,其中有壹個兩重根;
{
JINGDU K=B/A;
X1=-b/a+K;
X2=X3=-K/2; //X1=-b/a+K;X2=X3=-K/2
printf("%8f%8f%8f\n",X1,X2,X3);
JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);
return;
}
if(delta>ZERO)//當Δ=B^2-4AC>0時,方程有壹個實根和壹對***軛虛根
{
JINGDU Y1=A*b+3*a*(-B+MYSQRT(B*B-4*A*C))/2;
JINGDU Y2=A*b+3*a*(-B-MYSQRT(B*B-4*A*C))/2;//Y1,Y2=Ab+3a(-B±(B^2-4AC)^(1/2))/2
X1=(-b-sqr3(Y1)-sqr3(Y2))/(3*a); //X1=(-b-(Y1)^(1/3)-(Y2)^(1/3))/(3a);
JINGDU real=(-2*b+sqr3(Y1)+sqr3(Y2))/(6*a);//X2,X3=(-2b+(Y1)^(1/3)+(Y2)^(1/3))/(6a)
JINGDU complex=MYSQRT(3)*(sqr3(Y1)-sqr3(Y2))/(6*a);//±3^(1/2)((Y1)^(1/3)-(Y2)^(1/3))i/(6a)
printf("%5f\t",X1);
printf("%f+%fi\t",real,complex);
printf("%f-%fi\t\n",real,complex);
JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);
return;
}
if(delta<ZERO)//當Δ=B^2-4AC<0時,方程有三個不相等的實根
{
JINGDU T=(2*A*b-3*a*B)/(JINGDU)pow(2*A,3/2);//T= (2Ab-3aB)/(2A^(3/2))
JINGDU xita=ARCCOS(T); //θ=arccosT
X1=(-b-MYSQRT(2*A)*MYCOS(xita/3))/(3*a);//X1=(-b-2A^(1/2)cos(θ/3))/(3a);
X2=(-b+MYSQRT(A)*(MYCOS(xita/3)+MYSQRT(3)*MYSIN(xita/3)))/(3*a);
X3=(-b+MYSQRT(A)*(MYCOS(xita/3)-MYSQRT(3)*MYSIN(xita/3)))/(3*a);
printf("%8f%8f%8f\n",X1,X2,X3);
JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);
return;
}
JINGDU x=X1;
printf("%f",a*x*x*x+b*x*x+c*x+d);
}
int main(int argc, char* argv[])
{
//myfilesum();
JINGDU a,b,c,d;
cin>>a>>b>>c>>d;
x3fun(a,b,c,d);
return 0;
}