计算行列式(C++)

来源:互联网 发布:java什么是反射 编辑:程序博客网 时间:2024/04/30 02:38

利用等值变换,
将左下角元素化为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;}