计算行列式(C++)

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

猜你喜欢

转载自blog.csdn.net/qq_37299249/article/details/72863331