第一题:一元三次方程求解
(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;
}