1. 程式人生 > >演算法訓練 一元三次方程求解 藍橋杯

演算法訓練 一元三次方程求解 藍橋杯

問題描述   有形如:ax3+bx2+cx+d=0 這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,d 均為實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根與根之差的絕對值>=1。要求三個實根。。 輸入格式   四個實數:a,b,c,d 輸出格式   由小到大依次在同一行輸出這三個實根(根與根之間留有空格),並精確到小數點後2位 樣例輸入 1 -5 -4 20 樣例輸出 -2.00 2.00 5.00 資料規模和約定

  |a|,|b|,|c|,|d|<=10

原來以為是水題。。。

一開始對3次函式使用二分不能解決問題,於是對它求導,求出極點,然後極點與極點,極點與無窮大之間求零點就方便多了。

每次二分查詢都要用不同函式,但是函式返回值,引數型別數量相同,可以考慮用函式指標陣列。

執行一直出錯,可能是精度問題(類似於f(x)==0這種式子),調低精度(<0.001)。

#include<stdio.h>
#include<math.h>
float a,b,c,d;
float f0(float x){return a*x*x*x+b*x*x+c*x+d;}
float f1(float x){return 3*a*x*x+2*b*x+c;}
float f2(float x){return 6*a*x+2*b;}
float (*f[3])(float)={f0,f1,f2};
float biSearch(float x1,float x2,int item){
if(item==2)return (-1*b/(3*a));
if(fabs((*f[item])(x1))<0.01)
    return x1;
if(((*f[item])(x1))*((*f[item])((x1+x2)/2))<0)
    return biSearch(x1,(x1+x2)/2,item);
else
    return biSearch((x1+x2)/2,x2,item);
}
int main(){
float x21;
float x11,x12;
float x1,x2,x3;
scanf("%f%f%f%f",&a,&b,&c,&d);
x21=biSearch(-100,100,2);
//printf("%.2f\n",x21);
x11=biSearch(-100,x21,1);
x12=biSearch(x21,100,1);
//printf("%.2f %.2f\n",x11,x12);
x1=biSearch(-100,x11,0);
x2=biSearch(x11,x12,0);
x3=biSearch(x12,100,0);
printf("%.2f %.2f %.2f",x1,x2,x3);
return 0;}


相關推薦

演算法訓練 一元方程求解 藍橋

問題描述   有形如:ax3+bx2+cx+d=0 這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,d 均為實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根與根之差的絕對值>=1。要求三個實根。。 輸入格式   四個實

藍橋演算法訓練 一元方程求解

問題描述   有形如:ax3+bx2+cx+d=0 這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,d 均為實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根與根之差的絕對值>=1。要求三個實根。。 輸入格式   四個實數:a,b

藍橋一元方程求解

問題描述   有形如:ax3+bx2+cx+d=0 這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,d 均為實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根與根

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

https 格式 -m 要求 ble 方程 print else 如果 題目鏈接:https://www.luogu.org/problemnew/show/P1024 題目描述 有形如:ax3+bx2+cx+d=0 這樣的一個一元三次方程。給出該方程中各項的系數(a,

luogu1024 一元方程求解

iostream ble tar names 註意 stream 左右 ret == 題目大意 已知一元三次方程\(ax^3+bx^2+cx+d=0\): 有且只有3個根 對\(\forall x, x\in[-100,100]\) 對\(\forall x_1,x_2,

洛谷 P1024 一元方程求解

cstring stream () pro fin targe target bsp reg       洛谷 P1024 一元三次方程求解 題目描述 有形如: ax3 + bx2 + cx1 + dx0 = 0 這樣的一個一元三次方程。給出該方程中各項的系數( a,b,c

[P1034][NOIP2001]一元方程求解 (二分)

二分 #include<bits/stdc++.h> using namespace std; double a,b,c,d; double fc(double x) { return a*pow(x,3)+b*pow(x,2)+c*x+d; } int main()

題解 luogu P1024 【一元方程求解

這道題的二分原理題目已給出:f(x)*f(x+1)<0時,x至x+1中必有一根。那麼,我們只需要迴圈-100至100,再用分治考慮小數部分就可以了。下面附上程式碼: #include<bits/stdc++.h> using namespace std; double

zcmu-2116: 一元方程求解(二分,列舉)

2116: 一元三次方程求解 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 76  Solved: 31 [Submit][Status][Web

【Openjudge:Noi】7891:一元方程求解 c++

【Openjudge:Noi】7891:一元三次方程求解 總時間限制:  1000ms 記憶體限制:  65536kB 描述 有形如:ax3+bx2+cx+d=0  這樣的一個一元三次方程。 給出該方程中各項的係數(a,b,c,d  均為實數),並約定該方程

某葉C語言學習上重大的一步——一元方程求解

 目前某葉編的最難的程式了......感覺算是跨越吧,之前最難的是一元二次方程求解,雖然是最“難”的,只是因為最長,但是寫起來還是很輕鬆的  不過一元三次方程可一點都不輕鬆,很累,因為沒學過一元三次方程解法,所以需要百度,不過在C語言學習的書上找到了解法,要用牛頓迭代法求......   百度娘處充電,勉勉

一元方程-盛金公式求解

原理參考-百度百科(http://baike.baidu.com/link?url=eA-bEvbcOBM2XmA4rzIG-lgci4MQdQcr7lCzCHBW-qG-qcPaDNovXp_jYxS2FUjlrOh1obH_D3Yv6ME2JYOxPyCgKhHIaXC

C++求解一元方程

#include<iostream> #include<cmath> #include<iomanip> using namespace std; double fx(double nparam[3],double x) {  <s

一元方程

同一行 提示 int 是我 分享圖片 == include urn opened 題目描述 有形如:ax3+bx2+cx+d=0 這樣的一個一元三次方程。給出該方程中各項的系數(a,b,c,d 均為實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根

一元方程解法

  有形如:ax3+bx2+cx+d=0  這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,d  均為實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根與根之差

一元方程 (codevs 1038)題解

【問題描述】      有形如:ax3+bx2+cx+d=0這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,d均為實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根

算法訓練 2的冪表示(藍橋C++寫法)

ostream ali font 我們 DC ace 找到 進制 就是 問題描述   任何一個正整數都可以用2進制表示,例如:137的2進制表示為10001001。  將這種2進制表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3+2^

求解一元方程的兩種方法:牛頓迭代法和二分法

求解方程x*x*x-2*x-1=0,C語言實現 一:牛頓迭代法,牛頓迭代法是從泰勒公式中取前兩項構成線性近似方程,從x0開始,一步一步接近近似解,直到誤差在限定範圍內。 //牛頓迭代法求求解方程的根 #include <stdio.h> #include &l

藍橋 演算法訓練 2的冪表示

演算法訓練 2的次冪表示 問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。   將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下

藍橋-演算法訓練 2的冪表示

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 提示 用遞迴實現會比較簡單,可以一邊遞迴一邊輸出#include <cstdio> #include <iostream> #include <cstring> #include