已知一元三次方程\(ax^3+bx^2+cx+d=0\):
有且只有3個根
對\(\forall x, x\in[-100,100]\)
對\(\forall x_1,x_2,|x_1-x_2|\geq1\)
定理:令\(f(x)=ax^3+bx^2+cx+d\),則\(f(l)f(r)<0\leftrightarrow \exists x\in [l,r],使得f(x)=0\)
從拿到題開始我們很容易想到二分。二分求點都是求乙個點,包含該點的區間具有某一特定性質,不包含這個點的區間不具有這一特定性質。「區間的特定性質」便是性質4。但是怎麼保證區間中只有乙個點呢?由性質3可得每個長度為1的區間最多有乙個解。因此我們對於每個滿足性質4的長度為1的區間二分即可。
#include #include #include #include using namespace std;
const double eps = 0.0001;
double a, b, c, d;
double bsearch(double l, double r, double k, double eps, double (*getval)(double, double))
return mid;
}double func(double x)
double getval(double l, double r)
int main()
}//printf("%.2f %.2f %.2f\n", ans[1], ans[2], ans[3]);
//sort(ans+1, ans + 3 + 1);
for(int i=1; i<=anscnt; i++)
printf("%.2f ", ans[i]);
return 0;
}
洛谷 1024一元三次方程
一道noip上古時代的聯賽題,題目描述 我翻譯的精簡版 存在方程 f x ax 3 bsquare x cx d 0,已知有三個實數根在範圍 100與100之內,解與解的差至少為1,請你求出這三個實數解,精確到小數點後2位。先給出洛谷很多同學的標準解法 因為解與解的差至少為1,那麼我們應該對於 10...
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...
一元三次方程求解
有形如 ax 3 bx 2 cx d 0這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d均為實數 並約定該方程存在三個不同實根 根的範圍在 100至100之間 且根與根之差的絕對值 1。要求由小到大依次在同一行輸出這三個實根 根與根之間留有空格 並精確到小數點後2位。輸入有多行測試資料...