题目描述
有形如:
a
x
3
+
b
x
2
+
c
x
1
+
d
x
0
=
0
ax^3+bx^2+cx^1+dx^0=0
ax3+bx2+cx1+dx0=0这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在−100至100之间),且根与根之差的绝对值≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程f(x)=0,若存在2个数
x
1
x_1
x1和
x
2
x_2
x2,且
x
1
<
x
2
x_1<x_2
x1<x2,
f
(
x
1
)
×
f
(
x
2
)
<
0
f(x_1)\times f(x_2)<0
f(x1)×f(x2)<0,则在
(
x
1
,
x
2
)
(x_1,x_2)
(x1,x2)之间一定有一个根。
输入格式
一行,4个实数A,B,C,D。
输出格式
一行,3个实根,并精确到小数点后2位。
解题思路
由盛金公式解的
Talking is cheap,show you my code.
代码
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
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<<" ";
cout<<endl;
return 0;
}