一元三次方程的解
阿新 • • 發佈:2021-07-15
題目:
https://www.luogu.com.cn/problem/P1024
題目描述
有形如:a x^3 + b x^2 + c x + d = 0ax3+bx2+cx+d=0這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,da,b,c,d均為實數),並約定該方程存在三個不同實根(根的範圍在-100−100至100100之間),且根與根之差的絕對值\ge 1≥1。要求由小到大依次在同一行輸出這三個實根(根與根之間留有空格),並精確到小數點後22位。
提示:記方程f(x) = 0f(x)=0,若存在22個數x_1x1和x_2x2,且x_1 < x_2x1<x2,f(x_1) \times f(x_2) < 0f(x1)×f(x2)<0,則在(x_1, x_2)(x1,x2)之間一定有一個根。
確定單調區間然後二分
#include<iostream> #include<cstdio> #include<queue> using namespace std; double eps=1e-4; double a,b,c,d; double f(double x) { return a*x*x*x+b*x*x+c*x+d; } int main() { queue<double> q; scanf("%lf %lf %lf %lf",&a,&b,&c,&d); for(doublei=-100;i<100;i++) { double x1=i,x2=i+1; if(f(x1)==0) {q.push(x1); } else if(f(x1)*f(x2)<0) { double l=x1,r=x2; while(r-l>=eps) { double mid=(r+l)/2; if(f(mid)*f(r)<0) { l=mid; } else r=mid; } q.push(r); } if(q.size()==3) break; } printf("%.2lf",q.front()); q.pop(); while(!q.empty()) { printf(" %.2lf",q.front()); q.pop(); } }