一元三次方程的解
题目:
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(double i=-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(); } }
浙公网安备 33010602011771号