//运行环境VS2010 //要求矩阵对角线无0元素 #include<iostream> #include<math.h> #include<fstream> #include<iomanip> #include<string> #include<stdlib.h> using namespace std; int main() { double **A_B_Matrix; //行列式 double *Ans; //行列式的解 double dd; //无用缓存 char c; //无用缓存 string s; //无用缓存 int n=0; //矩阵的行数 int m=0; //矩阵的列数 ifstream read("data.dat"); while(getline(read,s)) //检测文件中矩阵有几行 { n++; } read.close(); read.open("data.dat"); while(1) //检测矩阵有几列 { read>>dd; m++; c=read.peek(); if(' '==c) break; } read.close(); if(m==n+1) { cout<<"行列式有唯一解"<<endl; } else { cout<<"此题无解或解不唯一"<<endl; exit(1); } Ans=new double[n+1]; Ans[n]=0; A_B_Matrix=(double **)new double *[n]; for(int i=0;i!=n;i++) { A_B_Matrix[i]=new double[n+1]; } int nn=0; read.open("data.dat"); while(!read.eof()) //将文件中的行列式读入A_B_Matrix { for(int i=0;i!=m;i++) { read>>A_B_Matrix[nn][i]; } nn++; } read.close(); for( int i=0;i!=n;i++) //寻找列中较大值 { double *Tem_Matrix; //行交换时中间值 Tem_Matrix=new double[n+1]; int Tem_R; //最大值所在行缓存值 Tem_R=i; for(int j=i+1;j!=n;j++) //选出列中最大值所在的行 { if(fabs(A_B_Matrix[Tem_R][i])<fabs(A_B_Matrix[j][i])) { Tem_R=j; } } for(int x=0;x!=n+1;x++) //行交换 { Tem_Matrix[x]=A_B_Matrix[Tem_R][x]; A_B_Matrix[Tem_R][x]=A_B_Matrix[i][x]; A_B_Matrix[i][x]=Tem_Matrix[x]; } for(int x=i+1;x!=n;x++) //形成下三角为0的矩阵 { double tem ; //行与行之间的倍数 tem=-A_B_Matrix[x][i]/A_B_Matrix[i][i]; for(int m=0;m!=n+1;m++) //将对应列下变为0 { A_B_Matrix[x][m]=A_B_Matrix[i][m]*tem+A_B_Matrix[x][m]; } } } cout<<"化简后的行列式为"<<endl; for(int i=0;i!=n;i++) { for(int j=0;j!=n+1;j++) { cout<<left<<setw(8)<<A_B_Matrix[i][j]<<' '; } cout<<' '; } cout<<"其解为"<<endl; for(int i=n-1;i!=-1;i--) //求解 { double sum=A_B_Matrix[i][n]; for(int j=i;j!=n;j++) { sum=sum-Ans[j+1]*A_B_Matrix[i][j+1]; } Ans[i]=(double)sum/A_B_Matrix[i][i]; } for(int i=0;i!=n;i++) //输出所有的解 { cout<<"x["<<i+1<<"]为"<<Ans[i]<<endl; } system("pause"); }