题解 P1024 【一元三次方程求解】

· · 题解

这里有一个叫做盛金公式的东西:

20世纪80年代,中学数学教师范盛金对如何解一元三次方程进行了深入的研究和探索,发明了比卡尔丹公式更实用的新求根公式——盛金公式,并建立了简明直观而且实用的新判别法——盛金判别法,同时提出了盛金定理。

盛金公式的特点是由最简重根判别式A=b^2-3ac,B=bc-9ad,C=c^2-3bd和总判别式\Delta=B^2-4AC来构成。

盛金公式简明易记、解题直观、准确高效,体现了数学的有序、对称、和谐与简洁美。

特别是当\Delta=B^2-4AC=0时,盛金公式3的表达式非常简洁漂亮。

盛金公式与判别法及定理形成了一套完整的、简明的、实用的、具有数学美的解三次方程的理论体系。

盛金公式:

有一个一元三次方程: ax^3+bx^2+cx^1+dx^0 (a,b,c\inR,a\ne0)

它的重根判别式A分别为:A=b^2-3ac

它的重根判别式B分别为:B=bc-9ad

它的重根判别式C分别为:C=c^2-3bd

它的总判别式\Delta分别为:B^2-4ac

当A=B=0时:

x_1$ = $x_2$ = $x_3$ = $\frac{-b}{3a}$ = $\frac{-c}{b}$ = $\frac{-3d}{c}

\Delta>0时:

Y_1 = Ab+3a(\frac{-B+\sqrt{B^2-4AC}}{2}) , Y_2 = Ab+3a(\frac{-B-\sqrt{B^2-4AC}}{2})

x_1$ = $\frac{-b-(\sqrt[3]{Y_1}+\sqrt[3]{Y_2})}{3a} x_2$ = $\frac{-b+\frac{1}{2}(\sqrt[3]{Y_1}+\sqrt[3]{Y_2}+\frac{\sqrt3}{2}(\sqrt[3]{Y_1}-\sqrt[3]{Y_2})i}{3a} x_3$ = $\frac{-b+\frac{1}{2}(\sqrt[3]{Y_1}+\sqrt[3]{Y_2}-\frac{\sqrt3}{2}(\sqrt[3]{Y_1}-\sqrt[3]{Y_2})i}{3a}

i = \sqrt {-1}

\Delta=0时:

设K = \frac{B}{A} (A\ne0)

$x_2$ = $x_3$ = $\frac{-K}{2}

\Delta<0时:

设T = \frac{2Ab-3aB}{2\sqrt{A^3}} , h = arccos T(A>0,-1<T<1)

x_1$ = $\frac{-b-2\sqrt{A}cos\frac{h}{3}}{3a} x_2$ = $\frac{-b+\sqrt{A}(cos\frac{h}{3}+\sqrt{3}sin\frac{h}{3})}{3a} x_3$ = $\frac{-b+\sqrt{A}(cos\frac{h}{3}-\sqrt{3}sin\frac{h}{3})}{3a}

最后,你们最需要的的无注释代码来啦:

#include<bits/stdc++.h>          
using namespace std;          
double a,b,c,d,A,B,T,ac,x1,x2,x3;          
int main(){          
    ios::sync_with_stdio(false);          
    cin.tie(0);          
    cin>>a>>b>>c>>d;          
    A=b*b-3*a*c;          
    B=b*c-9*a*d;          
    T=(2*A*b-3*a*B)/(2*sqrt(A*A*A));          
    ac=acos(T);          
    x1=(-b-sqrt(A)*cos(ac/3)*2)/3/a;          
    x2=(-b+sqrt(A)*(cos(ac/3)-sqrt(3)*sin(ac/3)))/(3*a);          
    x3=(-b+sqrt(A)*(cos(ac/3)+sqrt(3)*sin(ac/3)))/(3*a);          
    cout<<setprecision(2)<<fixed<<x1<<" "<<setprecision(2)<<fixed<<x2<<" "<<setprecision(2)<<fixed<<x3;          
}