算法训练 一元三次方程求解

问题描述

  有形如: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]);
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值