題目描述

思路
根與根之差的絕對值>=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;
}