// ベアストウ法を用いたN次方程式の解 // C++ 2010 Express コンソールアプリケーション #include "stdafx.h" #include "math.h" #define EPS 0.000001 #define MAXN 4 double a[]={1,-8,-6,-32,40}; // MAXNに次数,a に係数(次数+1個)を指定 void prExp(int nx, double a[]){//式の表示 nx:次数,a: 係数行列 int iflag=0; printf("\n** %d次方程式 : ",nx); for(int N=nx, i=0;i0) printf(" + %.0f",a[i]); else if(a[i]<0) printf(" - %.0f", fabs(a[i])); } else {// 先頭の係数には+を表示しない。 if(a[i] != 0){// 係数=0のときその項を表示しない if (a[i]==1 ) { if(iflag) printf(" + ");}// 係数=±1のとき係数値を表示しない else if(a[i]==-1) printf(" - "); else if(a[i]>0 ) { if(iflag) printf(" + "); printf(" %.0f",a[i]);} else printf(" - %.0f",fabs(a[i])); printf("X"); if(N>1) printf("^%d",N); iflag=1; } } } printf(" = 0 \n\n"); } void prComplex(double r, double i){ // 解の表示 r:実数部, i:虚数部 if (abs(i)EPS) && (abs(dq)>EPS)); for(int i=0;i<=n-2; i++)a[i]=b[i]; } void bairstow(int n, double a[]){// 3次式以上のとき,2次式の積に変換して解を求める double p,q; // n : 次数(n次方程式) while(n>=3){ bairstow(&p,&q,a,n); eqRoot(p,q); n-=2;} if (n==1) prComplex(-a[1]/a[0],0); // 1次式のとき else if(n==2) eqRoot(a[1], a[2]) ; // 2次式のとき } int _tmain(int argc, _TCHAR* argv[]) { // 3次式以上のとき,2次式の積に変換して解を求める prExp(MAXN, a); bairstow(MAXN, a); getchar(); return 0; }