解方程(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;
}

浙公網安備 33010602011771號