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;
}
转载于:https://www.cnblogs.com/RootVount/p/11255320.html
相关资源:JAVA上百实例源码以及开源项目