• 1038 一元三次方程求解


    1038 一元三次方程求解

    2001年NOIP全国联赛提高组

    时间限制: 1 s
    空间限制: 128000 KB
    题目等级 : 白银 Silver
     
     
     
    题目描述 Description

    有形如: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)之间一定有一个 根。

    输入描述 Input Description

    一个三次方程的各项系数

    输出描述 Output Description

    三个解

    样例输入 Sample Input

    1   -5   -4   20

    样例输出 Sample Output

    -2.00   2.00   5.00

    数据范围及提示 Data Size & Hint
     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 double a,b,c,d;
     5 double mid;
     6 int flag=0;
     7 double qz(double p)
     8 {
     9     return a*p*p*p+b*p*p+c*p+d;
    10 }
    11 
    12 void find(double x,double y)
    13 {
    14 
    15     if(y-x>=0.001)
    16     {
    17         mid=(x+y)/2;
    18         if(qz(mid)*qz(x)<0)
    19         {
    20             find(x,mid);
    21         }// 
    22         else
    23         {
    24             find(mid,y);
    25         }
    26     }
    27     if(flag==1)return;
    28     printf("%.2lf ",mid);
    29     flag=1;
    30     return;
    31 }
    32 int main()
    33 {
    34     
    35     cin>>a>>b>>c>>d;
    36     for(int i=-100;i<=100;i++)
    37     {
    38         double x1=i;
    39         double x2=i+1;
    40         if(qz(x1)==0)
    41         {
    42             printf("%.2lf ",x1);
    43         }
    44         if(qz(x1)*qz(x2)<0)
    45         {
    46             flag=0;
    47             find(x1,x2);
    48         }//两个数之间有一个根
    49         else
    50         continue;    
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    每行显示多少个
    CentOS挂载NTFS格式硬盘
    BAT教程 :第一节(批处理基础)
    BAT教程 第三节(FOR命令中的变量)
    BAT教程 :第二节(for命令详解 )
    USB设备读取的相关问题
    BAT教程 :第四节(批处理中的变量)
    内核级HOOK的几种实现与应用
    书籍链接
    BAT教程 :第五节(set命令详解)
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6612531.html
Copyright © 2020-2023  润新知