P1024 一元三次方程求解(分治演算法)

2022-05-30 16:48:11 字數 942 閱讀 2701

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

輸入格式:一行,4個實數a,b,c,d

輸出格式:一行,3個實根,並精確到小數點後2位。

題目的資料範圍不大,且根與根的絕對值之差大於等於1,因此可以考慮列舉寬度為1的區間。只要這個區間的左端點和右端點的函式值乘積小於零(即兩個函式值異號),則其中必定有乙個根。然後可以使用二分演算法,即每次取區間中點,如果中點和左端點的函式值乘積小於零,則在(左端點,中點)間一定有乙個根。再將中點賦值為右端點,繼續上述操作。否則,在(中點,右端點)間有根,將中點賦值為左端點,繼續上述操作。直到左端點和右端點的差小於0.001(題目要求精確到小數點後2位),此時輸出任意乙個端點。這裡使用右端點。注意:如果在列舉區間時,左端點的函式值恰好等於0,則直接輸出,不需再二分。

#include#include

#include

using

namespace

std;

double

a,b,c,d;

double func(int

x)int

main()

if(func((double)i)*func((double)j)<0)//

發現區間(left,right)中有解

else

//判定解的區域為(mid,right)

}printf(

"%.2lf

",right);

p++;

}if(p==3) break;//

一元三次方程至多有三個解

}

return0;

}

P1024 一元三次方程求解

傳送門 這道題看了題解,理解了一些,因為根x1與根x2之差絕對值大於等於1,只要符合f x1 f x2 0,那麼就在這個區間進行二分減小範圍 include using namespace std double a,b,c,d int s doublefc double x double binar...

一元三次方程求解 洛谷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 要求由小到大依次在同一行輸出這三個實根 根與根之間留有空格 並精確到小數點...