/* 只有1,2,3,4次方程有求跟公式 */
#include <cmath> #define OO 10 class equation { private: double A,B,C,D,E; public: double X[ 5 ]; int Count; equation( double a, double b ); equation( double a, double b, double c ); equation( double a, double b, double c, double d ); equation( double a, double b, double c, double d, double e ); double daet(){return B*B-4*A*C;} }; /* y = ax+b */ equation::equation( double a, double b ) { A = a;B = b; if ( a == 0 ) Count = OO; else { Count = 1; X[ 1 ] = B/A; } } /* y = ax^2+bx+c */ equation::equation( double a, double b, double c ) { A = a;B = b;C = c; if ( daet() < 0 ) { Count = 0; }else { if ( daet() == 0 ) Count = 1; else Count = 2; X[ 1 ] = (-b-sqrt( daet() ))/(2*a); X[ 2 ] = (-b+sqrt( daet() ))/(2*a); } } /* y = ax^3+bx^2+cx+d */ equation::equation( double a, double b, double c, double d ) { A = b*b-3*a*c;B = b*c-9*a*d;C = c*c-3*b*d; if ( A == 0 && B == 0 ) { Count = 1; X[ 1 ] = X[ 2 ] = X[ 3 ] = -c/b; }else if ( daet() < 0 ){ double T = (2*A*b-3*a*B)/(2*sqrt(A*A*A)); double S = acos( T ); Count = 3; X[ 1 ] = (-b-2*sqrt(A)*cos(S/3))/(3*a); X[ 2 ] = (-b+sqrt(A)*(cos(S/3)+sqrt(3)*sin(S/3)))/(3*a); X[ 3 ] = (-b+sqrt(A)*(cos(S/3)-sqrt(3)*sin(S/3)))/(3*a); }else if ( daet() == 0 ){ double K = B/A; Count = 2; X[ 1 ] = -b/a+K; X[ 2 ] = X[ 3 ] = -K/2; }else { double Y1 = A*b+3*a*(-B+sqrt(B*B-4*A*C))/2; double Y2 = A*b+3*a*(-B-sqrt(B*B-4*A*C))/2; Count = 1; X[ 1 ] = X[ 2 ] = X[ 3 ] = (-b-pow(Y1,1/3)-pow(Y2,1/3))/(3*a); } } /* y = ax^4+bx^3+cx^2+dx+e */ equation::equation( double a, double b, double c, double d, double e ) { double D1 = c*c-3*b*d+12*a*e; double D2 = 2*c*c*c-9*b*c*d+27*a*d*d+27*b*b*e-72*a*c*e; double D3 = sqrt(D2+sqrt(-4*D1*D1*D1+D2*D2)); double D = (pow(2,1/3)*D1)/(2*a*a*a*D3)+D3/(3*pow(2,1/3)*a); double AA = sqrt(b*b/(4*a*a)-2*c/(3*a)+D); double BB = b*b/(2*a*a)-4*c/(3*a)-D; double CC = -b*b*b/(a*a*a)+4*b*c/(a*a)-8*d/a; X[ 1 ] = -b/(4*a)-0.5*AA-0.5*sqrt(BB-CC/AA); X[ 2 ] = -b/(4*a)-0.5*AA-0.5*sqrt(BB+CC/AA); X[ 3 ] = -b/(4*a)-0.5*AA+0.5*sqrt(BB-CC/AA); X[ 4 ] = -b/(4*a)-0.5*AA+0.5*sqrt(BB+CC/AA); } #include <iostream> #include <cstdlib> using namespace std; int main() { equation E( 1, -5, -4, 20 ); cout << E.X[ 1 ] << " " << E.X[ 2 ] << " " << E.X[ 3 ] << endl; system("pause"); return 0; }
原文:http://blog.csdn.net/mobius_strip/article/details/21909145