洛谷OJ
阿新 • • 發佈:2019-01-25
-
題目描述
- 有形如:ax3+bx2+cx+d=0 這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,d 均為實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根與根之差的絕對值>=1。要求由小到大依次在同一行輸出這三個實根(根與根之間留有空格),並精確到小數點後2位。提示:記方程f(x)=0,若存在2個數x1和x2,且x1<x2,f(x1)*f(x2)<0,則在(x1,x2)之間一定有一個根。
- 輸入
- 一行,4個實數A,B,C,D。
- 輸出
- 一行,三個實根,並精確到小數點後2位。
- 樣例輸入
-
1 -5 -4 20
- 樣例輸出
-
-2.00 2.00 5.00
- 題目思路
-
題目給出根在-100到100之間,並且根與根之差的絕對值>=1 那麼我們便列舉每兩個相鄰的數字,如果確定根在這兩個數字之間。那麼在這兩個數字中二分查詢答案即可。
- 題目程式碼
#include <cstdio> #include <iostream> #include <map> #include <set> #include <vector> #include <stack> #include <cmath> #include <string> #include <cstring> #include <algorithm> #define LL long long using namespace std; double ans1, ans2, ans3; double a, b, c, d; double l, r, mid; double f1(double x){ return x*x*x*a + x*x*b + x*c +d; } double F(double x, double y){ l = x; r = y; while(l < r){ mid = (l+r) / 2.0; double ans1 = f1(l); double ans2 = f1(mid); if((ans1*ans2) <= 0) r = mid; else l = mid + 0.00001; } return r; } int main(){ while(scanf("%lf%lf%lf%lf",&a,&b,&c,&d) != EOF){ for(double i = -100; i <= 100; i++){ double ans1 = f1(i); double ans2 = f1(i+1); if(ans1 == 0) printf("%.2f ",i); if((ans1*ans2) < 0){ ans1 = F(i, i+1.0); printf("%.2f ",ans1); } } printf("\n"); } return 0; }