一元三次方程求解
题目描述
有形如:ax^3+bx^2+c^x+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)之间一定有一个根。
输入描述
输入一行,4 个实数 a, b, c, d。
输出描述
输出一行,3 个实根,从小到大输出,并精确到小数点后 2 位。
输入输出样例
输入
1 -5 -4 20
输出
-2.00 2.00 5.00
运行限制
- 最大运行时间:1s
- 最大运行内存:128M
/*
二分法
*/
#include <bits/stdc++.h>
using namespace std;
double a, b, c, d;
double y(double x) {
return a * x * x * x + b * x * x + c * x + d;
}
int main() {
cin >> a >> b >> c >> d;
for (int i = -100; i < 100; i++) { //题目说“根与根之差的绝对值≥1”,分为200个区间
double left = i, right = i + 1;
double y1 = y(left), y2 = y(right);
if (y1 == 0)
printf("%.2lf ", left); //判断左端点
if (y1 * y2 < 0) { //小区间内有根
for (int j = 0; j < 100; j++) { //在小区间内二分
double mid = (left + right) / 2;
if (y(mid)*y(right) <= 0)
left = mid;
else
right = mid;
}
printf("%.2lf ", right);
}
}
return 0;
}
加油哦! 如有错误和需要改进完善之处,欢迎大家纠正指教。