p1144一元三次方程求解
题目描述:
有形如:f(x)=ax^3+bx^2+cx+d=0这样的一元三次方程,给出该方程中各项的系数a,b,c,d,它们均为实数,并约定该方程一定存在着3个不同的实数解,解的范围在-100至100之间,且解与解之差的绝对值≥1。
现在请你编程,由小到大依次输出这三个实根,并精确到小数点后2位。
输入:
一行4个实数,每两个数之间用1个空格隔开,分别表示a,b,c,d。
1 -5 -4 20
输出:
一行3个实数,分别表示3个实根,每两个之间用1个空格隔开。注意由小到大
-2.00 2.00 5.00
提示:
记方程f(x)=0,若存在2个数x1和x2,且x1<x2,如果f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个解。
所以就直接将解扩大100倍从-100到100进行枚举如果在 i 到 i-1间有f(i)*f(i-1)<0那就说明在i到i-1之间一定有一个解,然后用二分查找解即可。
注意:所有变量都要用double,不然会出错,包括数组的变量。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iomanip> using namespace std; double a,b,c,d; double f(double x) { return(x*x*x*a+x*x*b+x*c+d); } double ans[100]; double bsearch(double l,double r) { if(r-l<=0.001) return l; double mid=(l+r)/2; if(f(l)*f(mid)<=0) return bsearch(l,mid); else return bsearch(mid,r); } int main() { cin>>a>>b>>c>>d; int ci=0; for(int i=-100;i<=100;i++) { double l=i,r=i+1; if(f(l)==0) ans[++ci]=l; else { if(f(l)*f(r)<0) { ans[++ci]=bsearch(l,r); } } if(ci>=3) break; } cout<<setiosflags(ios::fixed)<<setprecision(2); cout<<ans[1]<<' '<<ans[2]<<' '<<ans[3]<<endl; return 0; }