演算法訓練 一元三次方程求解 藍橋杯
|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