利用等值变换,
将左下角元素化为0(若对角不为1元素下方元素为1交换两行.)
结果为主对角之积
源码:
#include<iostream>
#include<iomanip>
using namespace std;
//By Vove.
class Determinant{
public:
Determinant(){
n=9;
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
s[i][j]=0;
}
void Display();
bool Cal_result();
void Input();
void Out_result();
private:
int n;
float s[9][9];
float result;
};
int Find(float temp[9][9],int i,int n);
void Swap(float temp[9][9],int i,int j,int n);
int main(){
cout<<"\t\t\t-------行列式计算--------"<<endl<<endl;
while(1){
Determinant D;
D.Input();
D.Cal_result();
D.Out_result();
}
return 1;
}
void Determinant::Input(){
cout<<"行列数:";
cin>>n;
cout<<endl<<"输入行列式:"<<endl;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>s[i][j];
cout<<"原式:"<<endl;
Display();
}
bool Determinant::Cal_result(){
for(int i=0;i<n-1;i++){
if(s[i][i]){//对角线元素不为0
if(s[i][i]!=1.0)
if(int j=Find(s,i,n)){ Swap(s,i,j,n); Display();}
for(int m=i+1;m<n;m++){
if(s[m][i]){
float temp=-(s[m][i])/s[i][i];
for(int p=0;p<n;p++){//R(m)+tempRi
s[m][p]=s[m][p]+temp*s[i][p];
}
if(temp>0)
cout<<"R"<<m+1<<"+"<<temp<<"R"<<i+1<<":"<<endl;
else
cout<<"R"<<m+1<<temp<<"R"<<i+1<<":"<<endl;
Display();
}
else continue;
}
}
else {//若对角线元素为0
int m;
for(m=i+1;m<n;m++){//
if(s[m][i]){//使对角线元素非0
for(int p=0;p<n;p++)//Ri+Rm
s[i][p]=s[m][p]+s[i][p];
break;
}
else continue;
}
if(m==n){
result=0;
return true;
}
cout<<"R"<<i+1<<"+"<<"R"<<m+1<<endl;
Display();
i--;
}
}
float sum=s[0][0];
for(i=1;i<n;i++)
sum=sum*s[i][i];
result=sum;
return true;
}
int Find(float temp[9][9],int i,int n){
for(int m=i+1;m<n;m++)
if(temp[m][i]==1.0)
return m;
return 0;
}
void Swap(float temp[9][9],int i,int j,int n){
cout<<"R"<<i+1<<"<-->R"<<j+1<<endl;
for(int m=0;m<n;m++){
temp[i][m]+=temp[j][m];
temp[j][m]=temp[i][m]-temp[j][m];
temp[i][m]-=temp[j][m];
}
}
void Determinant::Display(){
for(int i=0;i<n;i++){
cout<<"|";
for(int j=0;j<n;j++)
cout<<setw(8)<<s[i][j];
cout<<" |"<<endl;
}
cout<<endl;
}
void Determinant::Out_result(){
cout<<"="<<result<<endl<<endl;
}