1. 程式人生 > >洛谷 [P1024]一元三次方程求解【二分答案】

洛谷 [P1024]一元三次方程求解【二分答案】

https 格式 -m 要求 ble 方程 print else 如果

題目鏈接:https://www.luogu.org/problemnew/show/P1024

題目描述

有形如: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:
1 -5 -4 20
輸出樣例#1:
-2.00 2.00 5.00

解題思路
由於題目說明兩根之差的絕對值>=1,所以長度為1的區間內最多只有一個跟,於是我們先遍歷區間,利用f(x1)*f(x2)<0來判斷該區間內是否有根,再對有根的區間進行二分,找到根的精確值。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
double a, b, c, d;
double f(double x)
{
    
return (a*x*x*x + b * x*x + c * x + d); } int main() { double x1, x2, xx; cin >> a >> b >> c >> d; for (int x = -100; x <= 99; x++) { x1 = x; x2 = x + 1;//確定根可能所在的區間 if (f(x1) == 0)printf("%.2f ", x1);//把x1代入方程,如果解為0(與題目上方程解相符)則輸出x1 else if
(f(x1)*f(x2)<0)//如果小於0,則確定根在區間[x1,x2]中 { while (x2 - x1 >= 0.001) //二分法確定根的值,由於要精確到小數點後2位,所以這裏要算到第三位 { xx = (x1 + x2) / 2; if ((f(x1)*f(xx)) <= 0)x2 = xx; else x1 = xx; } printf("%.2f ", x1); } } return 0; }

2018-05-15

洛谷 [P1024]一元三次方程求解【二分答案】