洛谷題解 P1024 一元三次方程求解

2021-10-05 21:55:46 字數 1361 閱讀 3379

洛谷,

我的 oj,

有形如:

一行,4 個實數 a,b,c,d。

一行,3 個實根,並精確到小數點後 2 位。

1 -5 -4 20
-2.00 2.00 5.00
給了乙個特殊的一元三次方程,該方程在 [-100, 100] 之間存在 3 個不同的實根,而且實根之間差的絕對值大於等於 1。要求我們求出這 3 個實根。

本題是乙個方程求解問題,樣例資料沒什麼需要分析的,跳過。

[-100, 100] 之間求解,而且要求的精度為小數點後 2 位,也就是 1e-2。

這句話意味著什麼?

從上面的資料規模分析可以得出,最大的資料個數就是 20,000 個中篩選出 3 個資料。資料量小得可憐。因此本題的解法有很多種。

所謂暴力出奇蹟。我們可以看到,要求精度是 0.01,資料範圍為 [-100, 100],在這個範圍一共有 20,000 個資料,完全可以考慮用暴力列舉。

也就是從 -100 開始,到 100 結束,每間隔 0.01,對資料進行列舉。

#include const double eps = 1e-6;

int main()

bool check(double left, double mid)

double bsearch(double left, double right) else

}return left;

}int main() {

scanf("%lf%lf%lf%lf",&a,&b,&c,&d);

for (int i=-100; i<=100; i++) {

double x1 = calc(i);

double x2 = calc(i+1-eps);

if (fabs(x1)1、eps 定義。根據經驗公式,只需要比題目要求精度大兩個數量級即可。因此 1e-4 對於本題而言,足夠了。

2、check() 函式。我們知道該函式的作用是縮小查詢的範圍,本來我們是在 [left, right] 這個範圍找答案。因此根據題目提供的有根條件,我們可以嘗試在 [left, mid] 這個範圍查詢是否存在根,然後根據反饋進行範圍調整。當然也可以在 [mid, right] 這個範圍查詢。

3、由於根與根之差的絕對值 ≥ 1,這樣查詢區間總長不能為 2。如果查詢的區間總長為 2,依據上面的**,輸入的資料為 1 -4.65 2.25 1.4。當 i=0 的時候,x1!=0 && x1*x2<0,我們用二分查詢區間 [0, 1]之間可以查詢到乙個根為 1.00。當 i=1 的時候,x1=0,又會輸出乙個根 1.00。導致出現重複答案。

洛谷題解 P1024 一元三次方程求解

有形如 ax3 bx2 cx1 dx0 0這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d均為實數 並約定該方程存在三個不同實根 根的範圍在 100至100之間 且根與根之差的絕對值 1。要求由小到大依次在同一行輸出這三個實根 根與根之間留有空格 並精確到小數點後2位。一行,44個實數...

一元三次方程求解 洛谷P1024

題目描述 有形如 ax3 bx2 cx1 dx0 0這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d均為實數 並約定該方程存在三個不同實根 根的範圍在 100至100之間 且根與根之差的絕對值 1。要求由小到大依次在同一行輸出這三個實根 根與根之間留有空格 並精確到小數點後2位。輸入格...

洛谷 P1024 一元三次方程求解

有形如 ax 3 bx 2 cx 1 dx 0 0 這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d 均為實數 並約定該方程存在三個不同實根 根的範圍在 100 至 100 之間 且根與根之差的絕對值 ge 1 要求由小到大依次在同一行輸出這三個實根 根與根之間留有空格 並精確到小數點...