题目描述
题目描述
有形如:ax^3 + bx^2 + c这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值> =1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程f(x)=0,若存在2个数x1和x2,且x1< x2,f(x1)*(x2)< 0,则在(x1,x2)之间一定有一个根。
输入数据
输入该方程中各项的系数 (a,b,c,d 均为实数),由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 2 位。
样例输入
1 -5 -4 20
样例输出
-2.00 2.00 5.00
解题方法
采用二分法。当f(x1)*f(x2)<0时,在x1和x2之间一定有根,因此在(x1,x2)之间采用二分法,逐渐缩小范围,搜索实根。设low = x1,high = x2,mid = (high - low)/2 + low。
当f(x1)*f(mid)<0,说明(x1,mid)范围内存在实根;
当f(mid)*f(high)<0,说明(mid,x2)范围内存在实根。
代码
#include<stdio.h>
double a, b, c, d;
//返回函数值
double Func(int x) {
return a * x * x * x + b * x * x + c * x + d;
}
void main() {
int i;
scanf_s("%lf%lf%lf%lf", &a, &b, &c, &d);
//根与根之差的绝对值>=1,i的自增为1
for (i = -100;i <= 100;i++) {
if (Func(i) * Func(i + 1) < 0) {
double low = i, high = i + 1;
//二分法
while (high - low < 1e-8) {
double mid = (high + low) / 2;
if (Func(low) * Func(mid) <= 0)
high = mid;
else low = mid;
}
printf("%.2lf ", low);
}
//当函数值为零时,直接输出
if (Func(i) == 0)
printf("%.2lf ", i * 1.0);
}
}