Description
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值> =1。要求三个实根。
Input
四个实数:a,b,c,d
Output
由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位
Sample Input
1 -5 -4 20
Sample Output
-2.00 2.00 5.00
Hint
数据规模和约定
|a|,|b|,|c|,|d|< =10
1.盛金公式
一元三次方程aX3+bX2+cX+d=0,(a,b,c,d∈R,且a≠0)
重根判别式
总判别式Δ=B2-4AC。
当A=B=0时,
盛金公式1:
当Δ=B2-4AC>0时,
盛金公式2:
盛金公式2的三角式:
其中
,
。
当Δ=B2-4AC=0时,
盛金公式3:
其中
。
当Δ=B2-4AC<0时,
盛金公式4:
其中
,
(A>0,-1<T<1)。
2.盛金判别法
当A=B=0时,方程有一个三重实根。
当Δ=B2-4AC>0时,方程有一个实根和一对共轭虚根。
当Δ=B2-4AC=0时,方程有三个实根,其中有一个二重根。
当Δ=B2-4AC<0时,方程有三个不相等的实根。
3.盛金定理
当b=0,c=0时,盛金公式1无意义;当A=0时,盛金公式3无意义;当A≤0时,盛金公式4无意义;当T<-1或T>1时,盛金公式4无意义。
当b=0,c=0时,盛金公式1是否成立?盛金公式3与盛金公式4是否存在A≤0的值?盛金公式4是否存在T<-1或T>1的值?盛金定理给出如下回答:
盛金定理1:当A=B=0时,若b=0,则必定有c=d=0(此时,方程有一个三重实根0,盛金公式1仍成立)。
盛金定理2:当A=B=0时,若b≠0,则必定有c≠0(此时,适用盛金公式1解题)。
盛金定理3:当A=B=0时,则必定有C=0(此时,适用盛金公式1解题)。
盛金定理4:当A=0时,若B≠0,则必定有Δ>0(此时,适用盛金公式2解题)。
盛金定理5:当A<0时,则必定有Δ>0(此时,适用盛金公式2解题)。
盛金定理6:当Δ=0时,若A=0,则必定有B=0(此时,适用盛金公式1解题)。
盛金定理7:当Δ=0时,若B≠0,盛金公式3一定不存在A≤0的值(此时,适用盛金公式3解题)。
盛金定理8:当Δ<0时,盛金公式4一定不存在A≤0的值。(此时,适用盛金公式4解题)。
盛金定理9:当Δ<0时,盛金公式4一定不存在T≤-1或T≥1的值,即T出现的值必定是-1<T<1。
显然,当A≤0时,都有相应的盛金公式解题。
注意:盛金定理逆之不一定成立。如:当Δ>0时,不一定有A<0。
盛金定理表明:盛金公式始终保持有意义。任意实系数的一元三次方程都可以运用盛金公式直观求解。
#include <cstdio> #include <iostream> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <queue> #include <vector> #include <map> using namespace std; #define ll long long const int inf = 0x3f3f3f3f; const int mod = 1e9+7; int main() { double a,b,c,d; double as,bs,t,si; double x1,x2,x3; cin>>a>>b>>c>>d; as=b*b-3*a*c; bs=b*c-9*a*d; t=(2*as*b-3*a*bs)/(2*sqrt(as*as*as)); si=acos(t); x1=(-b-2*sqrt(as)*cos(si/3))/(3*a); x2=(-b+sqrt(as)*(cos(si/3)+sqrt(3)*sin(si/3)))/(3*a); x3=(-b+sqrt(as)*(cos(si/3)-sqrt(3)*sin(si/3)))/(3*a); cout<<fixed<<setprecision(2)<<x1<<" "; cout<<fixed<<setprecision(2)<<x3<<" "; cout<<fixed<<setprecision(2)<<x2<<endl; return 0; }