#include <iostream> #include <cmath> #include <algorithm> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ inline long double x0(long double a,long double b,long double c,long double d){ return (a+b+c+d)/4;} inline long double f(long double x,long double a,long double b,long double c,long double d){ return ((a*pow(x,3))+(b*pow(x,2))+(c*x)+d);} inline long double fp(long double x,long double a,long double b,long double c){ return ((3*a*pow(x,2))+(2*b*x)+c);} long double dp(long double x0,long double a,long double b,long double c,long double d){ int w=1000;double ans=x0-(f(x0,a,b,c,d)/fp(x0,a,b,c)); while(w--){ ans=ans-(f(ans,a,b,c,d)/fp(ans,a,b,c));} return ans;} int main(int argc, char** argv) { long double a,b,c,d; while(cin>>a>>b>>c>>d){ long double x1=dp(x0(a,b,c,d),a,b,c,d); long double A=(-b/a)-x1; long double C=(-d)/(a*x1); long double x2=(A+sqrt(A*A-(4*C)))/2; long double x3=(A-sqrt(A*A-(4*C)))/2; long double k[3]={x1,x2,x3}; sort(k,k+3); printf("%.2Lf %.2Lf %.2Lf\n",k[0],k[1],k[2]); } return 0; }
#include #include #include using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ inline long double x0(long double a,long double b,long double c,long double d){ return (a+b+c+d)/4;} inline long double f(long double x,long double a,long double b,long double c,long double d){ return ((a*pow(x,3))+(b*pow(x,2))+(c*x)+d);} inline long double fp(long double x,long double a,long double b,long double c){ return ((3*a*pow(x,2))+(2*b*x)+c);} long double dp(long double x0,long double a,long double b,long double c,long double d){ int w=1000;double ans=x0-(f(x0,a,b,c,d)/fp(x0,a,b,c)); while(w--){ ans=ans-(f(ans,a,b,c,d)/fp(ans,a,b,c));} return ans;} int main(int argc, char** argv) { long double a,b,c,d; while(cin>>a>>b>>c>>d){ long double x1=dp(x0(a,b,c,d),a,b,c,d); long double A=(-b/a)-x1; long double C=(-d)/(a*x1); long double x2=(A+sqrt(A*A-(4*C)))/2; long double x3=(A-sqrt(A*A-(4*C)))/2; long double k[3]={x1,x2,x3}; sort(k,k+3); printf("%.2Lf %.2Lf %.2Lf\n",k[0],k[1],k[2]); } return 0; }
簡單說明:
這位大大使用的方法為牛頓近似法,而不是牛頓因式檢驗法
函數 x0 用來設定起點
函數 f 將x0代入方程式
函數 fp 將方程式做微分並把值代入
函數dp 是用來做垂切,也就是找尋近似值的步驟,此處執行1001次以求近似
函數 main 裡面
第一步是先找出一個近似根
接著利用根與係數
求出兩根和、兩根積
再利用平方公式解出兩根
最後小到大排序並輸出