【枚举暴搜】【NOIP2001】一元三次方程求解
第一题:一元三次方程求解
(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; }