欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

洛谷P1024(一元三次方程求解)

程序员文章站 2022-05-09 10:27:23
...

洛谷P1024(一元三次方程求解)

题目描述

有形如:ax3+bx2+cx1+dx0=0ax^3+bx^2+cx^1+dx^0=0这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在−100至100之间),且根与根之差的绝对值≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程f(x)=0,若存在2个数x1x_1x2x_2,且x1<x2x_1<x_2,f(x1)×f(x2)<0f(x_1)\times f(x_2)<0,则在(x1,x2)(x_1,x_2)之间一定有一个根。

输入格式

一行,4个实数A,B,C,D。

输出格式

一行,3个实根,并精确到小数点后2位。

解题思路

由盛金公式解的

代码

#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;
}
相关标签: 洛谷 c++