【题目描述】
形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。
给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在−100至100之间),且根与根之差的绝对值≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
【输入】
一行,包含四个实数a,b,c,d,相邻两个数之间用单个空格隔开。
【输出】
一行,包含三个实数,为该方程的三个实根,按从小到大顺序排列,相邻两个数之间用单个空格隔开,精确到小数点后2位。
【输入样例】
1.0 -5.0 -4.0 20.0
【输出样例】
-2.00 2.00 5.00
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#define INF 999999999
#define N 50001
#define MOD 1000000007
#define E 1e-5
using namespace std;
double a,b,c,d;
double calculate(double x)
{
double ans=0;
double y=1;
for(int i=1;i<=3;i++)
y*=x;
y*=a;
ans+=y;
y=1;
for(int i=1;i<=2;i++)
y*=x;
y*=b;
ans+=y;
y=1;
y*=x;
y*=c;
ans+=y;
ans+=d;
return ans;
}
int main()
{
double x=-100,x1,x2,x3;
cin>>a>>b>>c>>d;
while(x-100<=E)
{
if(fabs(calculate(x))<=E)
break;
x+=0.01;
}
x1=x;
x+=0.01;
while(x-100<=E)
{
if(fabs(calculate(x))<=E)
break;
x+=0.01;
}
x2=x;
x+=0.01;
while(x-100<=E)
{
if(fabs(calculate(x))<E)
break;
x+=0.01;
}
x3=x;
printf("%.2lf %.2lf %.2lf\n",x1,x2,x3);
return 0;
}
信息学奥赛一本通T1238:分治算法 一元三次方程求解 归属于 分治算法,更多同类题解源程序见:分治算法 和 一元三次方程求解
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!