ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

二分(解方程p1024)

二分(解方程p1024)

P1024 [NOIP 2001 提高组] 一元三次方程求解

题目描述

有形如:\(a x^3 + b x^2 + c x + d = 0\) 这样的一个一元三次方程。给出该方程中各项的系数(\(a,b,c,d\) 均为实数),并约定该方程存在三个不同实根(根的范围在 \(-100\)\(100\) 之间),且根与根之差的绝对值 \(\ge 1\)。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 \(2\) 位。

提示:记方程 \(f(x) = 0\),若存在 \(2\) 个数 \(x_1\)\(x_2\),且 \(x_1 < x_2\)\(f(x_1) \times f(x_2) < 0\),则在 \((x_1, x_2)\) 之间一定有一个根。

输入格式

一行,\(4\) 个实数 \(a, b, c, d\)

输出格式

一行,\(3\) 个实根,从小到大输出,并精确到小数点后 \(2\) 位。

输入输出样例 #1

输入 #1

1 -5 -4 20

输出 #1

-2.00 2.00 5.00

说明/提示

【题目来源】

AC代码

#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;double fun(double x){return a*x*x*x+b*x*x+c*x+d;
}int main(){cin>>a>>b>>c>>d;int sum=0;double l,r,fl,fr,m,fm;for(int i=-100;i<100;i++){l=i;r=i+1;fl=fun(l);fr=fun(r);if(!fl) {sum++;printf("%.2f ",l);}if(fl*fr<0){while(r-l>0.001){m=(l+r)/2;fm=fun(m);if(fl*fm<=0){r=m;fr=fm;}else {l=m;fl=fm;}}printf("%.2f ",m);sum++;}if(sum==3) break;}return 0;
}
返回列表