题目描述
思路
根与根之差的绝对值>=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表示范围右端点,距离为1double 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;
}