Time Limit: 3 second
Memory Limit: 2 MB
有形如ax^3+bx^2+cx+d=0的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值≥1。要求由小到大依次在同一行输出这三个实根。(根与根之间留有空格),并精确到小数点后2位。
Input
输入文件仅一行
依次输入a,b,c,d用空格隔开
Output
输出仅一行,三个实根(根与根之间留有空格,最后用回车结束)
Sample Input
1 -5 -4 20
Sample Output
-2.00 2.00 5.00
【题解】
从-10000枚举到10000,然后除100,得到的就是-100.00到100.00,然后代入f函数,算出函数值,每次取两个值f(x1),f(x2),如果f(x1)*f(x2)<0,则表明x1-x2之间有一个解,这里我直接输出x1。因为是浮点数 所以等号无效。则相等要写成f(x)-0<0.000.......这样的形式.判断一下f(x1)或f(x2)是否近似等于0,如果是则直接输出x1或x2.
【代码】
#include <cstdio>
double a,b,c,d;
double ans[100];
int number = 0;
void input_data()
{
scanf("%lf %lf %lf %lf",&a,&b,&c,&d); //输入a,b,c,d
}
double get_number(double x) //计算f(x)函数
{
double ans = a*x*x*x+b*x*x+c*x+d;
return ans;
}
void get_ans()
{
int i = -10010; //开始枚举
while (i <= 10010)
{
double temp1 = i;
double temp2 = i+1;
temp1 = temp1/100;
temp2 = temp2/100;
double d1,d2;
d1 = get_number(temp1);d2 = get_number(temp2);
//获取f(x1)和f(x2)
double j = d1 * d2; //计算f(x1)*f(x2)
if (j <=0) //判断符号
{
if ((0-j) < 0.00001) //如果这个值无限接近0
{
if (d1 <0) d1=-d1;
if (d2 <0) d2=-d2;
if ((d1-0) <0.00001) ans[++number] = temp1;
else
ans[++number] = temp2;
//判断一下哪一个值是等于0,则增加1解
}
else
{
ans[++number] = temp1;
}
i+=98; //有提到两个解之间的差>1,则直接+100
}
else
i++;
}
}
void output_ans()
{
printf("%.2lf %.2lf %.2lf\n",ans[1],ans[2],ans[3]); //输出要用.xlf,x为保留位数
}
int main()
{
//freopen("E:\\rush.txt","r",stdin);
input_data();
get_ans();
output_ans();
return 0;
}