zoukankan      html  css  js  c++  java
  • 洛谷P1024 一元三次方程求解

    题目描述

    有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

    提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根。

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1:
    1 -5 -4 20
    
    输出样例#1:
    -2.00 2.00 5.00
    分析:提示给的非常明显了,每次枚举两个端点,然后二分不断缩小区间,到一定范围就好了.
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    double eps = 0.001;
    
    double a,b,c,d;
    int cnt;
    
    double f(double x)
    {
        return a * x * x * x + b * x * x + c * x + d;
    }
    
    int main()
    {
        cin >> a >> b >> c >> d;
        for (double i = -100.0; i <= 100.0; i++)
        {
            double x = i,y = i + 1;
            if (cnt == 3)
            break;
            if (f(x) == 0)
            {
                printf("%.2lf ",x);
                cnt++;
                continue;
            }
            double l = f(x),r = f(y);
            if (l * r < 0)
            {
            while (y - x >= eps)
            {
                double mid = (x + y) / 2;
                double t = f(mid);
                if (t * f(x) < 0)
                   y = mid;
                else
                   x = mid;
            }
            printf("%.2lf ",x);
            cnt++;
        }
    }
        
        return 0;
    } 
     
  • 相关阅读:
    modf()函数
    面向对象编程五大原则
    .Net网络资源
    整理CentOS常用命令
    在RHEL5上安装oracle10gLinux
    strchr()函数
    swab函数
    Strstr()函数
    tmpnam函数
    strdup ()函数
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7478763.html
Copyright © 2011-2022 走看看