现在的位置: 首页 > 综合 > 正文

【枚举暴搜】【NOIP2001】一元三次方程求解

2014年03月01日 ⁄ 综合 ⁄ 共 912字 ⁄ 字号 评论关闭

第一题:一元三次方程求解

(p1.pas p1.in p1.out)

问题描述

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

样例
输入:1   -5   -4   20
输出:-2.00   2.00   5.00

 

这一题数据范围是-100~100,保留小数小数点后两位,也就是20000的范围,所以暴力枚举轻松过

唯一值得注意的是,浮点数a和b判断相等不能之久用 a=b 判断,浮点数必定会有误差,要用 fabs(a-b)<1e-6 来判断

C++ Code

#include<cstdio>
#include<cmath>//fabs()函数头文件
#include<string>
#include<iostream>

double a,b,c,d;
double ans[10];

double f(double x)
{
    double y;
    y=a*x*x*x+b*x*x+c*x+d;
    return y;
}

double findans(double l,double r)
{
    double i;
    for(i=l;i<=r;i+=0.01)
    {
        if(f(i)==0)return i;
    }
}

int main()
{
    freopen("p1.in","r",stdin);
    freopen("p1.out","w",stdout);
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    double i;
    int num=0;
    for(i=-100.0;i<=100.0;i+=0.01)
        if(fabs(f(i))<=0.000001) {num++;ans[num]=i;}
    for(int j=1;j<num;j++)printf("%.2lf ",ans[j]);
    printf("%.2lf",ans[num]);
    return 0;
}

 

 

抱歉!评论已关闭.