7891.一元三次方程求解

本文最后更新于 2023年9月16日 早上

题目

描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。

给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

输入 一行,包含四个实数a,b,c,d,相邻两个数之间用单个空格隔开。

输出 一行,包含三个实数,为该方程的三个实根,按从小到大顺序排列,相邻两个数之间用单个空格隔开,精确到小数点后2位。

样例输入

1
1.0 -5.0 -4.0 20.0

样例输出

1
-2.00 2.00 5.00

分析

  1. 题目简化了求解难度, 根范围, 根间隔给出
  2. 以1为间隔简单找根
  3. 答案保留两位小数, 二分夹逼法

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;

double a, b, c, d;

double f(double x)
{
return a * x * x * x + b * x * x + c * x + d;
}

int main()
{

cin >> a >> b >> c >> d;
for (double i = -100; i <= 100; i++)
{
double x1 = i, x2 = i + 1;
if (f(x1) == 0)
{
printf("%.2lf ", x1);
}
else
{
if (f(x1) * f(x2) < 0)
{
while (x2 - x1 >= 0.001)
{
double xm = (x1 + x2) / 2;
if (f(xm) * f(x1) < 0)
{
x2 = xm;
}
else
{
x1 = xm;
}
}
printf("%.2lf ", x1);
}
}
}

return 0;
}

7891.一元三次方程求解
https://www.harkerhand.online/OJ/7891/
作者
harkerhand
发布于
2023年3月14日
更新于
2023年9月16日
许可协议