zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    关于interface
    如何应对微软的强制黑屏(转)
    启动不了AOS
    AX中对Programmable section的动态控制
    AX中的InventDimId
    关于MODI.Document = new MODI.Document();
    Window xp卸载oracle 10g
    oracle 字符串列转行
    取出表同一类型的指定范围记录
    rss2.0数据格式
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/6480735.html
Copyright © 2011-2022 走看看