问题描述
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求三个实根。。
输入格式
四个实数:a,b,c,d
输出格式
由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位
样例输入
1 -5 -4 20
样例输出
-2.00 2.00 5.00
数据规模和约定
|a|,|b|,|c|,|d|<=10
因为本题的主要函数 来源于 百度百科“一元三次方程” 因此算是转载文章
百度百科链接:https://baike.baidu.com/item/一元三次方程/8388473?fr=aladdin
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#include <math.h>
#include <complex>
/***************************************************************\
对复数 x 开 n 次方
\***************************************************************/
complex<double> sqrtn(const complex<double>&x, double n)
{
double r = _hypot(x.real(), x.imag()); //模
if (r > 0.0)
{//模不为零时,开方
double a = atan2(x.imag(), x.real()); //辐角
n = 1.0 / n;
r = pow(r, n);
a *= n;
return complex<double>(r * cos(a), r * sin(a));
}
return complex<double>(); //模为零时,返回零
}
/***************************************************************\
求解一元三次方程 a*x^3 + b*x^2 + c*x + d = 0
\***************************************************************/
void CubicEquation(complex<double> x[3], complex<double> a, complex<double> b, complex<double> c, complex<double> d)
{
a = 1.0 / a;
b *= a;
c *= a;
d *= a;
complex<double> u = ((9.0 * c - 2.0 * b * b) * b - 27.0 * d) / 54.0;
complex<double> v = 3.0 * ((4.0 * c - b * b) * c * c + ((4.0 * b * b - 18.0 * c) * b + 27.0 * d) * d);
v = sqrtn(v, 2.0) / 18.0;
complex<double> m = u + v;
complex<double> n = u - v;
if (n.real() * n.real() + n.imag() * n.imag() >
m.real() * m.real() + m.imag() * m.imag())
{
m = n;
}
a = b / -3.0;
if (m.real() * m.real() + m.imag() * m.imag() > 0.0)
{
m = sqrtn(m, 3.0);
n = (b * b - 3.0 * c) / (9.0 * m);
complex<double>o1(-0.5, +0.86602540378443864676372317075294);
complex<double>o2(-0.5, -0.86602540378443864676372317075294);
x[0] = m + n + a;
x[1] = o1 * m + o2 * n + a;
x[2] = o2 * m + o1 * n + a;
}
else
{
x[0] = x[1] = x[2] = a;
}
}
int main()
{
complex<double> X[3], a, b, c, d;
cin >> a >> b >> c >> d;
CubicEquation(X, a, b, c, d);
double x[3] = { real(X[0]),real(X[1]),real(X[2]) };
sort(x, x + 3);
printf("%.2f %.2f %.2f", x[0], x[1], x[2]);
}