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;
}

 

posted @ 2017-02-28 20:22  列車員lcy  阅读(187)  评论(0编辑  收藏  举报