题目描述
思路
根与根之差的绝对值>=1。
可以得出距离为1的区间最多只有一个根若存在2个数x1和x2,且x1 < x2,f(x1) x f(x2) < 0
,则(x1, x2)之间一定有一个根- 我们可以遍历每一个区间为1的范围,先判断左端点是否是根,再根据f(x1)和f(x2)的关系,判断当前范围内是否有根,如果有根,利用浮点数二分求出根的值
代码实现
#include <iostream>
using namespace std;
double a, b, c, d;
double get(double x) // 求f(x)的值
{
return a * x * x * x + b * x * x + c * x + d;
}
int main()
{
cin >> a >> b >> c >> d;
int s = 0; // 如果有三个根了,所有根都找到了,退出循环
for(double i = -100;i < 100; i++) // 遍历每一个区间为1的范围
{
double l = i, r = l + 1; // l表示范围左端点,r表示范围右端点,距离为1
double x1 = get(l), x2 = get(r); // 求出各自的f(x)
if(!x1) // 如果左端点为根,输出
{
printf("%.2lf ", l);
s++;
}
// 只用判断左端点是否为根即可,因为一个区间为1的范围最多只有一个根
if(x1 * x2 < 0) // f(x1) * f(x2) < 0,这个区间内有根
{
while(r - l >= 0.001) // 0.001是偏移量,浮点数二分
{
double mid = (l + r) / 2;
if(get(mid) * get(r) <= 0) l = mid; // 二分查找缩小根所在的范围
else r = mid;
}
printf("%.2lf ", r);
s++;
}
if(s == 3) break; // 所有根都找到了
}
return 0;
}