1. 程式人生 > >洛谷 P1024 一元三次方程求解

洛谷 P1024 一元三次方程求解

cstring stream () pro fin targe target bsp reg

      洛谷 P1024 一元三次方程求解

題目描述

有形如: ax3 + bx2 + cx1 + dx0 = 0 這樣的一個一元三次方程。給出該方程中各項的系數( a,b,c,d 均為實數),並約定該方程存在三個不同實根(根的範圍在 -100 至 100 之間),且根與根之差的絕對值 1 。要求由小到大依次在同一行輸出這三個實根(根與根之間留有空格),並精確到小數點後 22 位。

提示:記方程 f(x)=0 ,若存在 2 個數 x1?x2? ,且 x1?<x2?f(x1?) × f(x2?) < 0 ,則在 (x1?,x2?) 之間一定有一個根。

輸入輸出格式

輸入格式:

一行, 4 個實數 A,B,C,D 。

輸出格式:

一行, 3 個實根,並精確到小數點後 2 位。

輸入輸出樣例

輸入樣例#1: 復制
1 -5 -4 20
輸出樣例#1: 復制
-2.00 2.00 5.00

思路:二分

技術分享圖片
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
double a, b, c, d;
double f(double x) {
    return a*x*x*x + b*x*x + c*x + d;
}
double find1(double
l, double r) { while(r-l >= 0.000000001) { double mid = (l+r) / 2; double aa = f(mid); if(aa > 0) l = mid+0.000000001; else if(aa < 0) r = mid-0.000000001; else if(aa == 0.0) return mid; } return l; } double find2(double l, double r) { while(r-l >= 0.000000001) {
double mid = (l+r) / 2; double aa = f(mid); if(aa < 0) l=mid+0.000000001; else if(aa > 0) r = mid-0.000000001; else if(aa == 0.0) return mid; } return l; } int main() { scanf("%lf%lf%lf%lf",&a,&b,&c,&d); for(int i = -100; i < 100; i++) { double l = f(i); double r = f(i+1); if(l == 0.0) printf("%.2lf ", double(i)); else if(l>0 && r<0) printf("%.2lf ", find1(i, i+1)); else if(l<0 && r>0) printf("%.2lf ", find2(i, i+1)); } if(f(100.0) == 0.0) printf("100.00\n"); return 0; }
View Code

洛谷 P1024 一元三次方程求解